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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...