UI層複習筆記 在main文件中,UIApplicationMain函數一共做了三件事 根據第三個參數創建了一個應用程式對象 預設寫nil,即創建的是UIApplication類型的對象,此對象看成是整個應用程式的一個抽象,負責存儲應用程式的狀態。 根據第四個參數創建了一個應用程式代理類對象 所謂代 ...
UI層複習筆記
在main文件中,UIApplicationMain函數一共做了三件事
- 根據第三個參數創建了一個應用程式對象
- 預設寫nil,即創建的是UIApplication類型的對象,此對象看成是整個應用程式的一個抽象,負責存儲應用程式的狀態。
- 預設寫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(框架,邊框):用於描述這個視圖在父視圖中的位置及占據的區域大小
- CGRect結構提類型
- 包含origin屬性和size屬性
- origin:CGPoint類型的結構體
- size:CGSize類型的結構體
- CGRect包含四個浮點,兩個存儲x和y用於定位,兩個存儲width和height用於描述大小
- CGRect結構提類型
- 如何構建一個CGRect類型的結構體變數呢?
使用一組函數即可,函數名規律是是:結構體類型名 + Make
CGRect -> CGRectMake(x,y,w,h);
CGPoint -> CGPointMake(x,y);
CGSize -> CGSizeMake(w,h);
UIEdgeInset -> UIEdgeInsetMake();
特殊:UIRange -> UIMakeRange()
- frame(框架,邊框):用於描述這個視圖在父視圖中的位置及占據的區域大小
- 有哪些子類?
- UIWindow、UILabel都是UIView的直接子類,有一個特殊的分支叫UIControl,特殊之處在於有自己的高級事件,也管這個分支叫控制項,UIButton、UITextField都是控制項,但UILabel不是空間,雖然口頭交流時經常誤把很多不是空間的視圖也稱之為控制項,但概念要清楚,只有UIControl的子類才能叫做控制項。
UIView的幾個子類:
- UILabel 標簽
- 作用:顯示文字
核心屬性:
text
: 類型NSString
numberOflines
:顯示的行數,預設是1,如果設置為0,則代表行數無上限
font
:字體,字型大小
textColor
:文字顏色
backgroundColor
:背景色
textAlignment
:水平方向文本的對齊方式
- UIButton 按鈕
- 作用:以文字或圖片的樣式提供給用戶一個可點擊並相應的區域
- 核心屬性:預設圖文左右排
- 文字title:
setTitle: forState:
- 圖片image:
setImage: forState
對於尾碼是.png的圖片省略尾碼,其他的圖片類型就需要加尾碼名。 - 背景圖backgroundImage:
setBackgroundImage: forState
- 按鈕有四個狀態:normal(擺在那不動)、highlight(高亮狀態,按下去不鬆手)、selected(選中狀態,通過設置按鈕的selected屬性為YES才會進入到這個狀態)、disable狀態(不能用狀態,通過設置按鈕的enable屬性為NO時進入此狀態)
- 文字title:
- 創建事項:
- 使用工廠方法創建按鈕式,可以通過參數指定是系統版還是自定義版
- 使用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
- 情況一:點擊屏幕的空白處:點擊控制器的那個view
- 密碼框:
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)
- 有多少列
- 每列有多少行
- 每行長什麼樣子
- 一答:(delegate)
- 選中某行如何處理
- 三問:(DataSource)
- 我們關註三問一答
- 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的屬性,設置按鍵,位置不分左中右,可以用木棍,彈簧調整視圖。
- 位於導航界面的底部,預設是隱藏的,高度44個點,通過設置
- 設置導航控制器的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
- 普通樣式:
- 表示圖的樣式
- 表示圖的使用
- 創建實例
- 設置frame
- 添加到父視圖中
- 設置數據源方法 三問
- 設置代理 一答
- UITableViewController表示圖控制器
- 特點:
- 繼承自UIViewController,天生自帶一個UITableVIew屬性,通過tableView屬性訪問即可,此表示圖的dataSource和delegate代理已經被設置為當前的表示圖控制器,並且表示圖控制器也已經遵守了UITableView和UITableViewDelegate協議
- 使用:
- 在使用上,在創建一個類繼承UITableViewController,只需關註三問一答即可
- 特點:
- cell的復用
- 方式一:
- 原理:系統會自動將那些超出屏幕,看不見的對象回收到tableView的一個空閑隊列中存儲,所有在回答第三問,需要一個cell對象時,看有沒有已經回收的,可以拿出來使用的cell對象,如果沒有取到可重用的cell,我們就創建一個,如果取到了可重用的cell,我們就使用cell對象,但是要重新設置cell的顯示內容
- 方式二:
- 原理:系統會自動將那些超出屏幕,看不見的對象回收到tableView的一個空閑隊列中存儲,所有在回答第三問,需要一個cell對象時,看有沒有已經回收的,可以拿出來使用的cell對象,如果沒有取到可重用的cell,系統會按照我們之前註冊的cell幫我們創建一個cell,如果取到了可重用的cell,我們就使用cell對象,但是要重新設置cell的顯示內容
- UITableViewCell的組成:
- 內容視圖:
- 系統版:已經提供了三個可用的空間,用於顯示文字或圖片,可以通過cell的屬性進行設置
cell.textLabel
cell.detailTextLabel
cell.imageView
- 樣式有四款系統版:
- UITableViewCellStyleDefault
- UITableViewCellStyleValue1
如果沒有圖片 - UITableViewCellStyleValue
- UITableViewCellStyleSubtitle
- UITableViewCellStyleDefault
- 自定義內容視圖:
- 自定義內容駛入需要通過單元格的contentView屬性,找到contentView,然後往其上面添加自己的視圖
cell.contentView addSubview:
視圖 - 系統版:通過cell.accessoryType屬性設置
- 四款:
- 自定義版
- 給cell的accessoryView複製一個自己創建的視圖
cell.accessoryView = 自定義視圖
- 自定義內容駛入需要通過單元格的contentView屬性,找到contentView,然後往其上面添加自己的視圖
- 系統版:已經提供了三個可用的空間,用於顯示文字或圖片,可以通過cell的屬性進行設置
- 內容視圖:
- 方式一:
- 表格結合各種數據模型的顯示
- 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
- 不帶有任何系統定義好的用於顯示數據的視圖,只能訪問以下幾個屬性
- UITableView
- 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
+ 線的標識,完成觸發這一次跳轉動作
- 場景中觸發跳轉的控制項可能是使用代碼創建的,場景中條船到下一個場景的控制項不明確,這些情況都是不明確跳轉源頭的,實現跳轉的方式,選中源場景中的小黃點,連線到目標場景,選中自動生成的線,在第四個檢查器中,identifier屬性,為這根線起一個標識,最後在代碼中,通過控制器調用
- 跳轉到故事版中一個獨立的場景
- 先給獨立的創景在第三個檢查器中,設置storyboardID
在想要跳轉時利用故事版的instantiateViewControllerWithIdentifier
方法根據storyboardID創建對應的控制器對象
- 先給獨立的創景在第三個檢查器中,設置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
- 矢量圖,保存的不是點,記錄的是生成圖像的公式及函數,放大,縮小時不會失真(多用於廣告,海報)
- 如和繪圖
- OC對象與圖形的轉換
- Core Graphics(核心繪圖) 一套C語言的函數庫
- 另外一個名字:Quart2D 蘋果設備(iOS.OSX)上的2D的繪圖引擎
- 為了使用方便,系統對CoreGraphice做了一些封裝,直接使用UIKit下麵的UIImage UIColor NSString UIBezierPath 類型也可以實現簡單的曲線
- OC對象與圖形的轉換
- UITouch觸摸
- 什麼是觸摸:是一個UITouch類型的對象,當用戶touch視圖時,會自動將觸碰物理性的動作,轉換成對象存儲起來,這個對象就是UITouch對象
- 如何獲取touch對象
- 情況一:自定義視圖類,重寫類中指定方法,在這個方法中,通過傳入的參數可以獲得touch對象
- 情況二:對於觸碰控制器自帶的View,在控制器中重寫指定方法,通過參數也可以獲得touch對象
touchBegan
touchMove
touchesEnded
- 手勢
- 將用戶物理性的觸屏操作轉變成了對象存儲起來,所有手勢的父類UIGestureRecognizer
- 系統將一些有特點的觸屏操作封裝了不同的手勢類型,包括以下幾種:
UITapGestureRecognizer
點擊UISwipeGestureRecognizer
清掃UILongPressGestureRecognizer
長按UIPanPressGestureRecognizer
拖拽UIPinchPressGestureRecognizer
捏合UIRotationPressGestureRecognizer
旋轉
- 如何使用手勢?
- 創建指定手勢對象,在創建時設置好當該手勢發生時系統會自動調用什麼方法
- 設置手勢的核心屬性
- 將創建好的手勢添加到某個視圖上,當用戶在該視圖上做了手勢對應的動作,手勢就會觸發
- 創建指定手勢對象,在創建時設置好當該手勢發生時系統會自動調用什麼方法
- Tap手勢 ( 點擊 )
- 核心屬性:
- numberOfTapsRequired 需要點擊幾次
- numberOfTouchesRequired 需要幾個點
- numberOfTouches 返回有幾個點點擊
- 核心屬性:
- Swip手勢(輕掃)
- 核心屬性
- direction 清掃方向
----
以下的手勢 和 前面兩個不一樣,前面兩個是一次性手勢,手勢觸發一次,只調用一次時間方法,下麵手勢是由狀態,不同狀態都會調用時間方法,有以下狀態:
- 核心屬性
- 手勢觸發時: 起始狀態
- 手勢移動式: 改變狀態
- 手勢結束時: 結束狀態
- LongPress手勢(長按)
- 核心屬性
- 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
- 所有視圖都有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,在新的區域下就不再適用了,需要進行調整,也就是需要重新佈局
- 可能導致屏幕大小發生變化的原因:
- 設備不同(3.5寸下的橫豎屏,4寸下橫豎屏,4.7寸下的橫豎屏,5.5寸下橫豎屏)
- 各種bar:
- NavigationBar 豎屏是高64個點(20是狀態欄),橫屏是(52個點)沒有狀態欄;
- toolBar 豎屏是高44個點,橫屏是32個點
- tabBar 49點
- 狀態欄: 隱藏
- 來電時:綠色的狀態欄
- 錄音時:紅色的狀態欄
- 開啟個人熱點:藍色的狀態欄
- 鍵盤
- 如何佈局:
- 純代碼佈局(古老的方法)
- 理念:當屏幕發生變化時,自動執行一段代碼,在代碼中根據新的屏幕大小重新計算
- 純代碼佈局(古老的方法)
//此方法是重寫父類的方法 在屏幕內容從無到有會自動執行
//在屏幕旋轉時,也會自動執行
-(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