iOS總結_UI層自我複習總結

来源:http://www.cnblogs.com/Dog-Ping/archive/2017/01/06/6257165.html
-Advertisement-
Play Games

UI層複習筆記 在main文件中,UIApplicationMain函數一共做了三件事 根據第三個參數創建了一個應用程式對象 預設寫nil,即創建的是UIApplication類型的對象,此對象看成是整個應用程式的一個抽象,負責存儲應用程式的狀態。 根據第四個參數創建了一個應用程式代理類對象 所謂代 ...


UI層複習筆記

在main文件中,UIApplicationMain函數一共做了三件事

  • 根據第三個參數創建了一個應用程式對象
    • 預設寫nil,即創建的是UIApplication類型的對象,此對象看成是整個應用程式的一個抽象,負責存儲應用程式的狀態。
  • 根據第四個參數創建了一個應用程式代理類對象
    • 所謂代理,及幫助另一個對象做事情。上面第一步中創建的應用程式對象只負責存儲應用程式的狀態,但不提供響應,而是給代理髮消息,由代理負責針對不同的狀態提供響應。比如說:程式一啟動,代理就要響應一下,說明彈出的第一個界面是誰。
    • 其中,就是傳入一個類的類名字元串即可,此代理類對象一定是系統創建的,而且只有一個,也就是單利。其中AppDelegate class返回的是這個類的類型描述信息,在使用NSStrinFromClass這個函數,從類型信息中把類名以名字元串形式返回。
  • 第三件事,啟動了事件迴圈
    • 一個背後運行的死迴圈,用於不停地檢測屏幕上的觸點事件,一檢測到觸摸事件,立即將此事件傳給用用程式,讓程式提供相應

如何搭建一個界面? - UIViewController

  • 作用:
    • 負責創建界面
    • 負責提供界面與用戶的交互響應
  • 特點:
    • 天生自帶一個視圖屬性,所有界面設計就是添加到這個視圖即可。
  • 規範寫法:
    • step1:創建一個類,繼承自UIViewController
    • step2:在類中的viewDidLoad方法方法中,編寫構建界面的代碼
    • step3:在啟動方法中,只需要將這個自定義的類創建出實例,作為window的根視圖控制器即可
  • viewDidLoad方法的特點:
    • 此方法是控制器的那個view生命周期的起始點,即創建完view實例之後,第一個執行的方法,並且此方法只會調用一次
    • 除此方法外,view還會存在其他狀態,如:viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear,這些方法會隨著view的顯示或隱藏而執行多次,但只要控制器沒有銷毀,view沒有銷毀過,則viewDidLoad方法只會調用一次

界面元素的基礎 - UIView

  • 是什麼?所有界面上看的見的東西都是UIView的子類,系統定義的一個通用的描述界面上某個可顯示的矩形區域,一個重要的特性就是具備容器性,即UIView可以內部添加其它的UIView,除此以外它還能提供觸點的響應。
  • 核心屬性:
    • frame(框架,邊框):用於描述這個視圖在父視圖中的位置及占據的區域大小
      1. CGRect結構提類型
        • 包含origin屬性和size屬性
        • origin:CGPoint類型的結構體
        • size:CGSize類型的結構體
        • CGRect包含四個浮點,兩個存儲x和y用於定位,兩個存儲width和height用於描述大小
    • 如何構建一個CGRect類型的結構體變數呢?
      • 使用一組函數即可,函數名規律是是:結構體類型名 + Make

        CGRect -> CGRectMake(x,y,w,h);
        CGPoint -> CGPointMake(x,y);
        CGSize -> CGSizeMake(w,h);
        UIEdgeInset -> UIEdgeInsetMake();
        特殊:UIRange -> UIMakeRange()

  • 有哪些子類?
    • UIWindow、UILabel都是UIView的直接子類,有一個特殊的分支叫UIControl,特殊之處在於有自己的高級事件,也管這個分支叫控制項,UIButton、UITextField都是控制項,但UILabel不是空間,雖然口頭交流時經常誤把很多不是空間的視圖也稱之為控制項,但概念要清楚,只有UIControl的子類才能叫做控制項。

UIView的幾個子類:

  • UILabel 標簽
    • 作用:顯示文字
    • 核心屬性:

      text: 類型NSString
      numberOflines:顯示的行數,預設是1,如果設置為0,則代表行數無上限
      font:字體,字型大小
      textColor:文字顏色
      backgroundColor:背景色
      textAlignment:水平方向文本的對齊方式

  • UIButton 按鈕
    • 作用:以文字或圖片的樣式提供給用戶一個可點擊並相應的區域
    • 核心屬性:預設圖文左右排
      1. 文字title:setTitle: forState:
      2. 圖片image:setImage: forState 對於尾碼是.png的圖片省略尾碼,其他的圖片類型就需要加尾碼名。
      3. 背景圖backgroundImage: setBackgroundImage: forState
      4. 按鈕有四個狀態:normal(擺在那不動)、highlight(高亮狀態,按下去不鬆手)、selected(選中狀態,通過設置按鈕的selected屬性為YES才會進入到這個狀態)、disable狀態(不能用狀態,通過設置按鈕的enable屬性為NO時進入此狀態)
    • 創建事項:
      • 使用工廠方法創建按鈕式,可以通過參數指定是系統版還是自定義版
      • 使用new或alloc init 方式創建的按鈕,等價於傳自定義版參數
      • 如何選擇使用系統版,還是自定義版按鈕呢?
      • 因為系統自帶高亮,所有美工給一套圖時,就選系統版
      • 如果美工給了兩套圖,就選擇則自定義版
      • 自定義扮,title的文字顏色為白色,系統板時有預設顏色,title為藍色
    • 核心事件:
      • 事件種類:touchUpInside
      • 如何添加對事件的響應:addTarget: action: forControlEvent
  • UITextField
    • 作用:接受輸入
    • 核心屬性:

      text屬性:NSString類型。可讀可寫,讀取就是獲取輸入的文字,給屬性賦值,則文字會顯示到文本框中
      鍵盤屬性
      設置邊框樣式:borderStyle
      設置鍵盤樣式:keyboardType
      設置鍵盤右下角按鍵的樣式:returnType
      設置鍵盤整體色系風格:keyboardAppearance
      設置鍵盤是否是密碼框:secureTextEnter

    • 核心事件:

插播知識點

[xxx copy]將長度可變的的複製成長度不可變的
[xxx mutableCopy]將長度不可變的複製成長度可變的
NSArray --> [NSArray NSmutableCopy] -->NSmutableArray

問題

字元串類型的屬性是用什麼修飾?
答案:使用copy修飾,因為有一種特殊情況,就是一旦將MutableString賦值給屬性,一旦有其他的引用也指向這個可變字元串,就會有修改其內容的可能。這樣的話,就會導致明明聲明的是不可變長度的屬性,會發生內容的改變。一旦用了copy修飾,則就算賦值一個可變長度的內容,也會先執行一次copy,將其拷貝成一份長度不可變的副本,讓屬性只想這個副本,就算有其他引用修改那個長度可變的字元串,也不會影響副本的內容。

---

  • 文本框
    • 鍵盤為什麼彈起來?
      • 當有觸點在文本框時,系統對這個觸摸動作進行了響應,相應的結果就是讓文本框成為第一響應者
      • [textField becomeFirstResponder 成為第一響應者 ,調用鍵盤
    • 如何收鍵盤?
      • 取消掉文本框的第一響應者身份即可
      • [textField resignFirstResponder]
    • 什麼時候收鍵盤?
      • 情況一:點擊屏幕的空白處:點擊控制器的那個view
        • 實現控制器的 touchesBegan:方法即可
      • 如果有多個鍵盤:如果界面中有多個文本框,那麼可以通過結束他們父視圖的編輯狀態方法
        • 批量關閉所有文本框彈起的鍵盤:[self.view endEditing:YES];
      • 情況二: 點擊鍵盤右下角return按鍵
        • - (BOOL)textFieldShouldReturn:(UITextField *)textField
        • 右下角按鍵類型:returnKeyType
    • 密碼框:secure
    • 提示性:placeHolder
  • 代理
    • 遵守協議
    • 實現協議中的方法
    • 設置委托方的代理人為當前對象
    • 代理方法的第一個參數,是委托方本身。
  • 懶載入
    • 也叫延遲載入,等到需要使用時才開闢空間創建對象
  • 消息框UIAlertContent
    • 作用:彈出提示,有兩種樣式,屏幕中間,屏幕底部
    • 如何解決樣式?創建實例的時候,通過style參數,alert樣式在屏幕中間,actionsheet在屏幕底部
    • addTextFieldWithConfigurationHandler:參數是 block ,在block中可以設置 alert幫我們創建 文本框
    • 數組中的 文本框 是 第四步 添加進來的文本框
      UITextField usernameField = alert.textFields[0];
      UITextField
      passwordField = alert.textFields[1];
  • 使用xib技術實現界面
    • 理念:將控制器中原本需要些大量代碼進行構建界面的過程,通過一個尾碼是xib的文件簡化此操作。當再去創建控制器實例時,系統會通過讀取xib文件,完成界面的創建。針對系統創建的這個視圖,需要在控制器中訪問時,可以通過連線的方式完成關聯。
    • IBOutlet關鍵字:將控制器中的屬性與界面中系統創建的某個視圖關聯在一起
    • IBAction關鍵字:鍵控制器中的方法與界面中系統創建的某個視圖的時間關聯在一起
  • 切換VC
    • A -> B:使用的是A控制器的presentViewController方法
    • B -> A:使用的是B控制器的dismissViewController方法
    • 註意A和B的聲明周期:A推出B時,雖然看不見A了,但是A沒有被摧毀,從B返回A時,B會被銷毀,A從隱藏狀態編程顯示狀態
  • 使用xib簡化創建界面的過程
    • 如何實現
    • 藉助於系統的Interface Builder 完成,IB以前是一款獨立的軟體,現在整合到xcode中, 只需要創建自定義的控制器時,勾選下麵的“Also Creat Xib file”選項,則自動生成與控制器名相同,尾碼為xib的文件,xib以前叫做叫nib
  • UIStepper 步進控制項
    • 作用:記錄一個浮點值,並且控制項提供了兩個按鍵界面,由用戶精確地控制記錄支個值得遞增或遞減
    • 核心屬性:value
    • 核心事件:valueChanged
  • UISlider 滑塊控制項
    • 作用:記錄一個浮點值,通過一個可以滑動的按鍵,快速在某個範圍內得到一個不容易精確控制的數值
    • 核心屬性:value
    • 核心事件:valueChanged
  • UISwitch 開關控制項
    • 作用:記錄一個布爾值,通過點擊的方式,可以記錄用戶是否的選擇
    • 核心屬性:on(BOOL類型)
    • 核心事件:valueChanged
  • SegmentedControl 分段控制項
    • 核心屬性:selectedSegmentIndex
    • 核心事件:valueChanged
  • Activity Indicator 菊花控制項
    • 核心屬性:isAnimating
    • 核心方法:startAnimating stopAnimating
  • Progress 進度提示條
    • 核心屬性:progress (0 ~ 1 浮點)

註意:浮點型和整形相比,永遠也到不了1。浮點型精確到小數點後6位

  • NSTimer定時器
    • 作用:可以設置某方法,每個一段時間,自動執行
    • 如何創建並啟動?
      • timerXXXXX : 創建好的定時器,不會自動啟動,我們只有把該定時器添加到事件迴圈中
      • scheduleXXXX: 創建好定時器後,自動啟動
  • DatePicker
    • 核心屬性:date
    • 核心方法:日期格式化 HH - mm - ss yyyy - MM - dd
  • PickView
    • 我們關註三問一答
      • 三問:(DataSource)
        1. 有多少列
        2. 每列有多少行
        3. 每行長什麼樣子
      • 一答:(delegate)
        1. 選中某行如何處理
  • UINavigationController導航控制器
    • 作用:為了管理多個控制器
    • 配置導航類(NavigationBar)
      • 高度:算上狀態欄64個點(狀態欄20個點)
      • 內容:通過navigationItem屬性來完成設置
      • navigationItem設置的是每個界面上導航欄中的內容
      • 左:leftBarButtonItem/leftBarButtonItems
      • 中:title/title View
      • 右:rightBarButtonItem/rightBarButtonItems
      • 左右都是類似於可點擊的按鍵,是UIBarButtonItem類型
    • 如果修改NavigationBar 的外觀,該導航下所有子控制器都會改變
      • self.navigationController.navigationBar.tintColor = [UIColor redColor];
    • 配置工具欄(toolBar)
      • 位於導航界面的底部,預設是隱藏的,高度44個點,通過設置Navigation.toolBarHidden = NO 即可顯示
      • toolBar中可以通過toolBarItem的屬性,設置按鍵,位置不分左中右,可以用木棍,彈簧調整視圖。
    • 設置導航控制器的titleColor
  • UIImageView
    • UIImage(存圖片) -> UIImageView(顯示圖片的視圖)
    • 核心:image
    • UIViewContentModeScaleToFill 預設,設置的寬高是多少,就是多少
    • UIViewContentModeScaleAspectFit 保持寬高比
    • UIViewContentModeScaleAspectFill 保證寬高比,可能圖片會被切割掉
    • //裁剪 姿勢圖超出的部分
      iV.clipsToBounds = YES;
  • UIKit層面動畫
    • 預備:動畫 -- 序列幀動畫
      • 每一幀是一張靜態的圖片,按照一定間隔時間,快速連續播放,最終通過人眼的視覺停留效果實現的動畫
  • UIScrollView滾動視圖
    • 作用:用於查看更大範圍的圖片或文字內容信息的視圖
    • 特點:雖然是視圖,但本身scrollView沒有外觀,主要是通過載入子視圖來完成的展示,內部子視圖的區域可以大於scrollView占據的空間,通過滑動這種交互方式能夠實現查看超出範圍的那些子視圖
    • 核心屬性:

      frame 可視區域的大小
      contentSize 內容大小(可以滑動區域的大小)
      contentOffset 記錄滑動的偏移量
      pagingEnabled 設置整頁滑動
      showsHorizontalScrollIndicator 是否隱藏水平滾動條
      showsVerticalScrollIndicator 是否隱藏豎直滾動條
      bounces 是否有彈性效果

  • UIPageControl
    • 作用:頁數的提醒
    • 外觀:一條區域中包含多個小圓點
    • 核心屬性:
      • numberOfPages 圓點的個數
      • currentPage 當前被選中的是第幾個小圓點(下標從0開始)
      • pageIndicatorTintColor 設置未選中的圓點顏色
      • currentPageIndicatorTintColor 選中圓點的顏色
      • userInteractionEnabled 是否與用戶交互
    • 與ScrollView配合頁數移動方法:
      • 在scrollView的協議方法中
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    NSInteger currentPage = scrollView.contentOffset.x / scrollView.frame.size.width + 0.5;
    self.pageControl.currentPage = currentPage;
}
  • UITableView表示圖
    • 作用:實現以一列多行來顯示大量數據的一種視圖,父類是ScrollView
    • 表格樣式
      • 普通樣式:plain
      • 分區樣式:group
    • 表示圖的樣式
    • 表示圖的使用
      1. 創建實例
      2. 設置frame
      3. 添加到父視圖中
      4. 設置數據源方法 三問
      5. 設置代理 一答
  • UITableViewController表示圖控制器
    • 特點:
      • 繼承自UIViewController,天生自帶一個UITableVIew屬性,通過tableView屬性訪問即可,此表示圖的dataSource和delegate代理已經被設置為當前的表示圖控制器,並且表示圖控制器也已經遵守了UITableView和UITableViewDelegate協議
    • 使用:
      • 在使用上,在創建一個類繼承UITableViewController,只需關註三問一答即可
  • cell的復用
    • 方式一:
      1. 原理:系統會自動將那些超出屏幕,看不見的對象回收到tableView的一個空閑隊列中存儲,所有在回答第三問,需要一個cell對象時,看有沒有已經回收的,可以拿出來使用的cell對象,如果沒有取到可重用的cell,我們就創建一個,如果取到了可重用的cell,我們就使用cell對象,但是要重新設置cell的顯示內容
    • 方式二:
      1. 原理:系統會自動將那些超出屏幕,看不見的對象回收到tableView的一個空閑隊列中存儲,所有在回答第三問,需要一個cell對象時,看有沒有已經回收的,可以拿出來使用的cell對象,如果沒有取到可重用的cell,系統會按照我們之前註冊的cell幫我們創建一個cell,如果取到了可重用的cell,我們就使用cell對象,但是要重新設置cell的顯示內容
    • UITableViewCell的組成:
      • 內容視圖:
        • 系統版:已經提供了三個可用的空間,用於顯示文字或圖片,可以通過cell的屬性進行設置 cell.textLabel cell.detailTextLabel cell.imageView
        • 樣式有四款系統版:
          1. UITableViewCellStyleDefault
          2. UITableViewCellStyleValue1

            如果沒有圖片
          3. UITableViewCellStyleValue
          4. UITableViewCellStyleSubtitle
        • 自定義內容視圖:
          • 自定義內容駛入需要通過單元格的contentView屬性,找到contentView,然後往其上面添加自己的視圖cell.contentView addSubview:
            視圖
          • 系統版:通過cell.accessoryType屬性設置
          • 四款:
          • 自定義版
          • 給cell的accessoryView複製一個自己創建的視圖cell.accessoryView = 自定義視圖
  • 表格結合各種數據模型的顯示
  • step1:一定要為表示圖控制器增加一個屬性,存儲表格要顯示的數據,基本上類型定為數組類型
    • 前提:表格的行數是不定的,也叫動態表格
    • 將數組顯示到表格中:NSArray -> TableView
    • 將對象數組顯示到表格中
      • 自定義一個數據模型類 Model(M)

  • self.tableView.tableFooterView:在viewDidLoad中直接設置表尾視圖
  • self.tableView.tableHeaderView:在viewDidLoad中直接設置表頭視圖
  • self.tableView.rowHeight:設置行高 都設置行高
  • heightForRowAtIndexPath::設置行高的代理方法

  • 向表格中添加數據
    • 方式一: 全部刷新 reloadData
    • 方式二: 局部刷新
      • NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.dataArr.count - 1 inSection:0]; 在使用前,一定要先將插入的數據插入到數組
      • [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
  • 委托反向傳值增加數據
  • 代理傳值

  • 表格的編輯模式
    • 什麼是表格的編輯?
    • 表格上提供了刪除,增加,移動這樣的標識,點擊後可以實現表格中的數據刪除,增加以及移動
  • 如何進入到表格的編輯狀態
    • 設置表格的editing為YES即可
  • 如何增加或刪除®
    • 兩問一答
    • 問一:當前行是否可以編輯(選問,預設是所有都能編輯)
    • canEditRowAtIndexPath:
    • 問二:當前行是如何編輯<增加,刪除>(選問,預設都是刪除)
    • editingStyleForRowAtIndexPath:
    • 答一:增加或刪除編輯按鍵點中時應該如何處理
    • commitEditingStyle: forRowAtIndexPath:
  • 如何移動表格中的單元格
    • 一問一答
    • 一問:當前行是都可以移動
    • 一答:移動動作完成後如何處理後續工作

  • performSelector: withObject: afterDelay: 延遲多久調用什麼方法

  • 靜態表格 行數固定不變
    • 主要應用場景:設置界面
    • 實現特點:控制器中會出現大量的硬編碼,會有很多的if switch 這樣的分支語句
  • 下拉刷新 UIRefreshControl 的實例進行下拉刷新


  • UICollectionView集合視圖
    • 視圖可以一多行多列的形式來展示數據,是從tableView演變而來,所以在使用上,與tableView很想,從iOS6以後開始支持
    • 與tableView的異同點
  • 相同點:
    • UITableView 關註三問一答(幾個分區,每個分區多少行,每行什麼樣子)
    • UICollectionView 關註三問一答(幾個分區,每個分區多少項,每項什麼樣子)
  • 不同點:
    • UITableView
      • 預設自帶了用於顯示數據的三個視圖 textLabel,detailTextLabel,imageView
      • 佈局:系統定義好,永遠是一列多行,從上到下,按順序依次排列
    • UICollectionView
      • 不帶有任何系統定義好的用於顯示數據的視圖,只能訪問以下幾個屬性
        • backGroundColor,backGroundView,contentView
      • 佈局:需要搭配一個獨立的對象來對視圖中的多各項進行佈局
      • 佈局對象:所屬類型為UICollectionViewLayout或其子類,系統只給我們提供一種佈局,UICollectionViewFlowLayout(流式佈局)繼承自UICollectionViewLayout
  • UITabBarController選項卡控制器
    • 以橫向併列卡片式,來管理多個控制器,並已經實現了點擊後的切換,和UINavigationController很想都是管理子控制器的,但不同的是導航控制器是層層推進的
  • tabBarController.viewControllers = @[avc,bvc,cNavi];
  • 設置當前是第幾頁:tabBarController.selectedIndex = 1;
  • BViewController *bVC = tabBarController.viewControllers[1];
  • bVC 傳值;
  • self.tabBarController.tabBar.tintColor = [UIColor purpleColor];
  • self.tabBarItem.image = [[UIImage imageNamed:@"line_bell"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]一個永遠不受tintColor影響的圖片

故事版

  • 特點:快速開發,並可以在故事版文件瞭解整個應用程式的界面結構
  • 啟動時,系統自動做了什麼?
    • 根據target中配置載入Main.stroyboard文件
    • 自動創建window對象
    • 自動創建在故事版中有啟動箭頭指向的那個界面背後控制器對象
    • 自動將控制器對象設置為window的rootViewController
    • 自動將window顯示出來
  • 跳轉
    • 連線跳轉:從一個觸發跳轉的控制項或場景(故事版看得見界面)連線到要跳轉到的目標控制器
    • 連線:segue 每條線都是一個對象
  • 明確跳轉源頭
    • 明確知道跳轉是哪個控制項觸發的,實現方式,無需寫代碼,直接連線
  • 不明確跳轉源頭:
    • 場景中觸發跳轉的控制項可能是使用代碼創建的,場景中條船到下一個場景的控制項不明確,這些情況都是不明確跳轉源頭的,實現跳轉的方式,選中源場景中的小黃點,連線到目標場景,選中自動生成的線,在第四個檢查器中,identifier屬性,為這根線起一個標識,最後在代碼中,通過控制器調用performSegueWithIdentifier + 線的標識,完成觸發這一次跳轉動作
  • 跳轉到故事版中一個獨立的場景
    • 先給獨立的創景在第三個檢查器中,設置storyboardID
      在想要跳轉時利用故事版的instantiateViewControllerWithIdentifier方法根據storyboardID創建對應的控制器對象
  • 使用present或push跳轉即可
    • 跳轉其他xib的控制器
    • 跳轉到其他故事版的場景中
  • 傳值 prepareForSegue:

    使用這個方法跳轉時,需要攔截下來segue對象,
    找到segue對象的目標控制器segue.destinationViewController
    如果目標控制器是一個導航控制器,還需要使用navi.viewControllers[0]找到目標控制器下的跟控制器
    如果當前控制器有兩條先,需要進行判斷

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    {
        UINavigationController *navi = segue.destinationViewController;
        RegisterViewController *registerVC = navi.viewControllers[0];
        registerVC.delegate = self;
    }

  • viewController的屬性,隱藏控制器中所有Bar:hideBottomBaronPush
  • 9 切片
    • 目的:改圖,使用代碼的方法或直接使用xcode的功能,對一些有規律的 或 內容重覆的圖片進行動態的修改大小

  • 通過代碼實現9切片
    • image = [image stretchableImageWithLeftCapWidth:30 topCapHeight:30]; :這個是拉伸處理
    • image = [image resizableImageWithCapInsets:UIEdgeInsetsMake(20, 20, 20, 20)];:預設是磁塊平鋪
    • image = [image resizableImageWithCapInsets:UIEdgeInsetsMake(20, 20, 20, 20) resizingMode:UIImageResizingModeTile];
  • 返回值都是返回一個圖片,需要用一個新的圖片來接受

  • 第二部分
  • 繪圖:(繪製圖片 繪製字元串 繪製圖形)
  • 變形:(位移 旋轉 縮放)
  • UITouch
  • 手勢:(點擊 雙擊 輕掃 拖拽 長按 捏合 旋轉)
  • 深入坐標系(frame bounds center transform)
  • 動畫:核心動畫 CoreAnimation (CA動畫)
  • 佈局:(代碼 AutoResing AutoLayout SizeClasses)
  • 通知
  • 聊天頁面練習

  • 繪圖:
  • 基本概念:
    圖像和顯示器.顯示器如何顯示內容?
    由晶體組成->發RGB的光,混合後產生不同的顏色
    整個顯示器顯示的就是一副好多個彩色的點構成的圖像
    一個點對應就是一個像素,用4個位元組保存,系統會自動將臨近的4個點使用一個平均色來記錄,於是圖像的大小就變成了原來的1/4

  • 圖像
    記憶體中的圖像有2種:
  • 點陣圖(點陣圖)用RGB來生成(PNG,JPG)
    • PNG 帶透明通道,iOS開發儘量使用PNG,IPG會自動渲染回PNG
  • 矢量圖,保存的不是點,記錄的是生成圖像的公式及函數,放大,縮小時不會失真(多用於廣告,海報)
  • 如和繪圖
    1. OC對象與圖形的轉換
      • Core Graphics(核心繪圖) 一套C語言的函數庫
      • 另外一個名字:Quart2D 蘋果設備(iOS.OSX)上的2D的繪圖引擎
    2. 為了使用方便,系統對CoreGraphice做了一些封裝,直接使用UIKit下麵的UIImage UIColor NSString UIBezierPath 類型也可以實現簡單的曲線

  • UITouch觸摸
  • 什麼是觸摸:是一個UITouch類型的對象,當用戶touch視圖時,會自動將觸碰物理性的動作,轉換成對象存儲起來,這個對象就是UITouch對象
  • 如何獲取touch對象
    • 情況一:自定義視圖類,重寫類中指定方法,在這個方法中,通過傳入的參數可以獲得touch對象
    • 情況二:對於觸碰控制器自帶的View,在控制器中重寫指定方法,通過參數也可以獲得touch對象
    • touchBegan touchMove touchesEnded
  • 手勢
  • 將用戶物理性的觸屏操作轉變成了對象存儲起來,所有手勢的父類UIGestureRecognizer
  • 系統將一些有特點的觸屏操作封裝了不同的手勢類型,包括以下幾種:
    • UITapGestureRecognizer 點擊
    • UISwipeGestureRecognizer 清掃
    • UILongPressGestureRecognizer 長按
    • UIPanPressGestureRecognizer 拖拽
    • UIPinchPressGestureRecognizer 捏合
    • UIRotationPressGestureRecognizer 旋轉
  • 如何使用手勢?
    1. 創建指定手勢對象,在創建時設置好當該手勢發生時系統會自動調用什麼方法
    2. 設置手勢的核心屬性
    3. 將創建好的手勢添加到某個視圖上,當用戶在該視圖上做了手勢對應的動作,手勢就會觸發
  • Tap手勢 ( 點擊 )
    • 核心屬性:
      1. numberOfTapsRequired 需要點擊幾次
      2. numberOfTouchesRequired 需要幾個點
      3. numberOfTouches 返回有幾個點點擊
  • Swip手勢(輕掃)
    • 核心屬性
      1. direction 清掃方向

    ----

    以下的手勢 和 前面兩個不一樣,前面兩個是一次性手勢,手勢觸發一次,只調用一次時間方法,下麵手勢是由狀態,不同狀態都會調用時間方法,有以下狀態:
  • 手勢觸發時: 起始狀態
  • 手勢移動式: 改變狀態
  • 手勢結束時: 結束狀態
  • LongPress手勢(長按)
    • 核心屬性
      1. minimumPressDuration 長按所需最小時間
  • Pan(拖拽)
    • locationInView:獲取的是父視圖的絕對位置
    • translationInView: 獲取的是相對於手勢開始時的相對位置 (是相對位置)△x △y
  • Pinch手勢(捏合)
    • 核心屬性:velocity 縮放速率
    • scale 縮放比例
  • Rotation旋轉
    • 核心屬性:rotation
  • 變形
    • 什麼時變形:視圖發生了位移,旋轉,縮放這樣的變化叫做變形,如何實現視圖的變形.通過修改視圖的transform屬性,就能完成變形
    • tranform
      • 類型:CGAffineTransform 結構體類型
      • 該結構體中包含了9個值,是一個3*3的矩陣,矩陣的對角線上是三個定值不會發生變化,剩下的6個變數是控制變形的,可以藉助系統提供的API實現數值的改變
    • rotation:旋轉
      • CGAffineTransformMakeRotation
      • CGAffineTransformRotation
    • scale:縮放
      • CGAffineTranformMakeScale
      • CGAffineTranformScale
    • translation:位移
      • CGAffineTranformMakeTranslation
      • CGAffineTranformTranslation
    • 帶make的函數 都是相對於初始狀態
    • 不帶make是在變形基礎上繼續位移
    • CGAffineTransformIdentity給transform屬性賦值該常量,裡面所有屬性全部清空
  • 手勢加變形
    • pan手勢:位移
    • rotation手勢: 旋轉
    • pinch手勢:縮放
    • tap手勢:取消所有變形效果
  • 手勢共存
    • 需要哪個手勢共存 只要設置該手勢的代理人 為當前對象即可
      obj -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
    • 返回一個BOOL值,為YES即可.

清空所有變形 [sender setTranslation:CGPointZero inView:self.view];

  • 深入坐標系
  • frame:
    • CGRect類型
    • 作用:定位,視圖的坐定點在父視圖坐標系對應點的坐標,以及視圖在父視圖中占據了多大的空間
  • bounds
    • CGRect類型
    • 作用:描述了視圖自身的坐標的頂點的值,以及視圖自身的尺寸大小
  • center
    • CGPoint類型
    • 描述視圖的中心點在父視圖坐標系的坐標位置
  • transform
    • CGAffineTransform類型
    • 描述視圖的變形狀態
frame bounds center transform
frame 改變原點:不變;改變大小:變
bounds 改變原點:不變;該大小:變 不變 不變
center 不變 不變
transform 不變 不變 不變


  • CoreAnimation層面動畫
    • CALayer層(顯示的基礎)
      • backgroundColor : 設置背景顏色
      • borderWidth : 設置邊寬
      • cornerRadius : 設置圓角半徑
      • borderColor : 設置邊的顏色
      • shadowColor : 設置陰影顏色
      • shadowOffset : 設置陰影偏移量
      • shadowOpacity : 設置陰影的透明度 預設為零 opacity 只會修改自己``alpha 改變父視圖,會帶著子視圖一起變化
      • shadowRadius : 設置陰影的半徑
      • layer.masksToBounds : 按邊緣進行遮罩
      • position 位置 (預設是0,0點)
      • anchorPoint 錨點 (預設是 0.5,0.5)
    • UIView核心的顯示功能就是依賴底層的CALayer實現的,每一個UIView都包含了一個CALayer對象,修改了CALayer,會影響顯示出來的UIView外觀
  • 如何獲取CALayer
    • 所有視圖都有CALayer的屬性,通過.layer即可獲取
    • 自己創建CALayer對象,添加到視圖的layer中
    • 圖片CALayer
      • 給contents賦值即可
    • 文字CATextLayer
      • 給string屬性賦值即可
    • 圖形CAShapeLayer
      • 給path屬性賦值CGPath對象
  • 變形
    • 旋轉按照錨點旋轉
    • CATransform3D類型
  • 一個角度轉弧度的巨集
    #define angleToRadian(x) (x) / 180.0 * M_PI
  • CADisplayLink定時器
    • 用 displayLinkWithTarget 類方法創建
    • 需要加到運行迴圈中 RunLoop
    • [_link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    • displayLink定時器中有一個暫停的屬性paused.預設是NO
  • CALayer的很多屬性都有隱式動畫,在修改屬性時,會自動出現動畫效果,可以通過查看頭文件中,屬性上出現了 animatable這樣的說明,意味著該屬性有隱式動畫
  • CAAnimation動畫
    • CA的動畫,只能施加在CAlayer上
    • CA動畫是假的,視圖看著好像位置改變了,但其實沒有變
    • UIView動畫,由於明確了設定了動畫的結束視圖的狀態,所以使徒的數據會隨著動畫的結束而真的被改變
  • CAAnimation 子類
  • 子類一:CABasicAnimation 基礎動畫,設置動畫的其實和中點值即可
  • 一定要設置keyPath屬性,以此說明動畫要修改的是什麼
  • keyPath
  • toValue 要用NSValue轉換一下
  • repeatCount 重覆次數
  • autoreverses BOOL值 是否回去
  • anim.toValue = [NSValue valueWithCGPoint:CGPointMake(100, 400)];
  • duration 設置時長
  • anim.removedOnCompletion = NO;動畫結束時,是否把動畫從視圖上移除
  • anim.fillMode = kCAFillModeForwards;將視圖固定在動畫結束時 的位置,還需要配合該屬性使用------這個方法要和上面的方法配合使用
    • kCAFillModeBackwards在動畫開始前,只需要將動畫加入一個layer,layer便立即進入到動畫的初始狀態並等待動畫的運行
    • kCAFillModeBoth 開始和結束的兩種狀態都有
    • kCAFillModeRemoved 這個是預設值,也就是說動畫開始前和動畫結束後動畫對layer都沒有影響,動畫結束後layer會恢復到之前的狀態
    • kCAFillModeForwards 在動畫結束時,layer停留在動畫的結束狀態
    • 子類二:CAKeyframeAnimation 關鍵幀動畫
      • 關鍵幀動畫,可以定義動畫過程中的細節,所以可以通過values屬性,記錄中間變化的每一個關鍵的細節,在每兩個關鍵點中自動做動畫
    • 子類三:CAAnimationGroup
      • 動畫組中需要的是CAAnimation,組中動畫可以同時運行
      • positionAnima.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];:動畫組的線性函數

  • 佈局(Layout)
    • 什麼是佈局:是指在一個視圖中,如何擺放它的子視圖(設置子視圖的位置和大小)
    • 為什麼要用佈局:屏幕的尺寸經常會發生變化,使得屏幕可顯示的區域也發生變化,於是最開始添加子視圖的frame,在新的區域下就不再適用了,需要進行調整,也就是需要重新佈局
    • 可能導致屏幕大小發生變化的原因:
      1. 設備不同(3.5寸下的橫豎屏,4寸下橫豎屏,4.7寸下的橫豎屏,5.5寸下橫豎屏)
      2. 各種bar:
        • NavigationBar 豎屏是高64個點(20是狀態欄),橫屏是(52個點)沒有狀態欄;
        • toolBar 豎屏是高44個點,橫屏是32個點
        • tabBar 49點
      3. 狀態欄: 隱藏
        • 來電時:綠色的狀態欄
        • 錄音時:紅色的狀態欄
        • 開啟個人熱點:藍色的狀態欄
      4. 鍵盤
  • 如何佈局:
    • 純代碼佈局(古老的方法)
      - 理念:當屏幕發生變化時,自動執行一段代碼,在代碼中根據新的屏幕大小重新計算
//此方法是重寫父類的方法 在屏幕內容從無到有會自動執行
//在屏幕旋轉時,也會自動執行
-(void)viewDidLayoutSubviews
{
//self.topLayoutGuide.length 頂部被占據的高度
//self.bottomLayoutGuide.length  底部被占據的高度
};
  • AutoResizing 佈局
    - 是什麼? iOS5之前自動佈局技術,操作簡單,API簡單,功能也簡單,有一定的局限性,很以前的技術
    - 核心理念:當視圖發生變化時,

  • AutoLayout(自動佈局)
    • 在iOS10以前配合SizeClasses技術完成屏幕的適配工作
    • 工作原理:通過一些類的"約束constraint"來描述視圖的展示位置
    • 什麼是約束?代表一個條件,只需要設定一些約束,則系統就會根據這一堆約束,自動計算符合約束的frame
    • 如何創建約束?
      • 方式一:用代碼創建
      • 方式二:在stroyBoard中 或 xib中可視化配置
    • 約束的兩個原則:
      • 1.描述清楚(x,y,w,h)
      • 2.約束不能衝突
    • 約束對象:每一個約束條件都是一個約束對象
    • 方法一:萬能公式法
      • 任何一個是視圖的約束都可以由下麵的等式描述出來,就是要把文字性的描述編程等式中的參數
    • 方法二:VFL法(Visual Format Language
      • 是一個字元串,具有一定的格式,不同的格式代表不同的約束,並且一個字元串,往往能一次性表達出多個約束
      • VFL特殊符號的含義:
      • | 代表父視圖的邊緣
      • H:| 代表父視圖的左邊
      • V:| 代表父視圖的頂部
      • [] 代表一個子視圖(控制項)
      • () 條件
      • -x- 代表間隔為x
        • 代表間隔為標準間隔 8

  • 通知:完成對象之間的消息傳遞(觀察者模式)
  • 實現的核心理念:
    • 通知的發送發不知道接收方是誰,是需要將通知發給通知中心即可
    • 通知的接收方不知道發送方是誰,只需要提前向通知中心訂閱一個通知即可
    • 一單通知的發送發真的發出了通知,則由通知中心負責將這個通知推送給所有訂閱了該通知的對象們
  • 應用:跨界面傳值;系統之間的事情,鍵盤彈起等
  • 與代理方式對比:
    • 代理只是兩個對象之間,私密的消息的傳遞
    • 通知可以是一個對象對多個對象的消息傳遞,但彼此並不知道對方是誰
  • 核心對象
    • 通知中心:NSNotificationCenter (單例,系統自己創建好的)
    • 通知 NSNotification
  • 自定義通知
    • 自己寫通知的發送方以及接收方
  • 系統提供的通知: 鍵盤通知
    • 系統通知,系統會在適當的時候自己發通知,如果我們需要接受,只需要向通知中心註冊即可,也就是說我們只需要實現接收方就可以了
    • 接受鍵盤通知:
      • 鍵盤將要顯示 UIKeyboardWillShowNotification
      • 鍵盤已經顯示 UIKeyboardDidShowNotification
      • 鍵盤將要隱藏 UIKeyboardWillHideNotification
      • 鍵盤已經隱藏 UIKeyboardDidHideNotification
        

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本系列將從以下三個方面對Tinker進行源碼解析: 轉載請標明本文來源:http://www.cnblogs.com/yyangblog/p/6252855.html更多內容歡迎star作者的github:https://github.com/LaurenceYang/article如果發現本文有什 ...
  • 地址 MD5 https://dl-ssl.google.com/android/repository/android_m2repository_r08.zip 8C8EC4C731B7F55E6467914871AB8802 https://dl-ssl.google.com/android/re ...
  • service—Android的四大組件之一。人稱“後臺服務”指其本身的運行並不依賴於用戶可視的UI界面 實際開發中我們經常需要service和activity之間可以相互傳遞數據維持程式的運行。 先瞭解Service的生命周期吧。 新建一個類繼Service: 新建以上類並繼承Service後只會 ...
  • Android Butterknife 8.4.0 使用方法總結 ...
  • Android SDK版本號 與 API Level 對應關係如下表: Code nameVersionAPI level (no code name) 1.0 API level 1 (no code name) 1.1 API level 2 2008 年9月發佈的Android第一版 Cupc ...
  • APP簡介 律師查詢是基於聚合數據的律師查詢介面做的,這個介面目前處於停用狀態,但是,由於我是之前申請的,所以,還可以用,應該是無法再申請了。 效果圖 開發 一、HttpHelper 既然是請求介面的,那就少不了請求方式,這裡是比較常用的HttpClient,用起來也比較方便,單獨封裝一個HttpH ...
  • 作者:Antonio Leiva 時間:Jan 5, 2017 原文鏈接:https://antonioleiva.com/lambdas-kotlin/ 由於Lambda表達式允許更簡單的方式建模式函數,所以它是Kotlin和任何其他現代開發語言的最強工具之一。 在Java6中,我們僅能下麵方法這 ...
  • 看完這篇你學到什麼: 熟悉gradle的構建配置 熟悉代碼構建環境的目錄結構,你知道的不僅僅是只有src/main 開發、生成環境等等環境可以任意切換打包 多渠道打包 APK輸出文件配置 需求 一般我們開發的環境分為:debug 和 release,但是你想再分內測1環境、內測2環境等等怎麼辦呢? ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...