6.1 視圖控制器
- 創(chuàng)建視圖控制器基本的最佳實踐如下:
1.保持VC輕量級肘迎,業(yè)務邏輯抽出
2.VC中不應編寫動畫邏輯安皱,動畫邏輯放在動畫類中,將需要動畫的view傳入
3.數(shù)據(jù)源房匆、業(yè)務分離,VC做連接的事情
4.VC響應視圖的事件报亩,再進行相關的數(shù)據(jù)操作
5.VC響應來自操作系統(tǒng)的UI相關事件浴鸿,如方向變換、內存警告
6.當使用xib或者storyboard時弦追,init方法不會調用
7.view抽離岳链,不要在VC中寫UI
8.有時候可以抽離基礎VC,但要根據(jù)業(yè)務進行設計
9.有些時候可以考慮使用category創(chuàng)建可復用代碼骗卜,避免形成過多繼承
6.1.1 視圖加載
- loadView調用時機:每次訪問vc的view(vc.view宠页、self.view)并且view為nil的時候,就會被調用
- 默認實現(xiàn)為[super loadView]寇仓,具體策略如下:
1.如果在初始化UIViewController指定了xib文件名举户,就會根據(jù)傳入的xib文件名加載對應的xib文件
[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
2.如果沒有找到相關聯(lián)的xib文件,就會創(chuàng)建一個空白的UIView遍烦,然后賦值給UIViewController的view屬性俭嘁,大致如下:
[[ViewController alloc] init]; // 加載ViewController .xib
3.如果沒有找到相關聯(lián)的xib文件,就會創(chuàng)建一個空白的UIView服猪,然后賦值給UIViewController的view屬性供填,大致如下:
self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]];
- 在vc的生命周期中l(wèi)oadView在viewDidLoad前面
- 如果loadView()方法沒有被override,則默認會生成一個白色背景罢猪、大小與屏幕一致的視圖賦值給該view屬性
- 一般不必override loadView()方法近她;若override,則必須負責為view賦值
- 若重寫了loadView膳帕,沒必要[super loadView]粘捎,因為[super loadView]默認會創(chuàng)建一個空白的UIView。我們既然要通過代碼來自定義UIView,那么就沒必要事先創(chuàng)建一個空白的UIView攒磨,以節(jié)省不必要的開銷泳桦。
6.1.2 視圖層級
- 視圖結構和渲染步驟如下:
1.構造子視圖
2.計算并提供約束
3.為子視圖遞歸執(zhí)行步驟1和步驟2
4.遞歸渲染
- iOS8.1-iPhone6,從視圖加載(initWithCoder:)到渲染(viewWillAppear:)之間的平均耗時300毫秒
- viewDidAppear:會因為過渡動畫的原因在約300毫秒后會調用
6.1.3 視圖可見性
- viewWillAppear:當視圖層級已經(jīng)準備好娩缰,且視圖即將放入視圖窗口時灸撰,此方法會被調用。這時視圖還處于不可見拼坎,不要進行動畫操作
- viewDidAppear:當視圖出現(xiàn)浮毯,過渡動畫完成后,此方法會被調用
- 當應用從后臺切入前臺時演痒,不會調用vc的生命周期相關方法亲轨,只會通知UIAppDelegate相關代理方法
- 沒事盡量不要重寫loadView
6.2 視圖
- 避免較大的xib趋惨、storyboard鸟顺,xml在真正加載之前會被i/o加載以及解析
- view盡可能的延時加載,盡可能重用
6.2.1 UILabel
- 使用字體器虾、字體類型以及要被渲染的文本時讯嫂,計算需要的像素數(shù)目。這是一個耗時操作
- 檢查要被渲染的寬度
- 檢查numberOfLines,計算將要展示的行數(shù)
- sizeOfFit是否被調用兆沙,如果是欧芽,則計算高度
- 如果sizeOfFit沒有被調用,檢查當前的內容能否在給定的高度下是否展示出來
- 如果frame不夠葛圃,使用lineBreakMode確定隱藏或截斷的位置
- 陰影千扔、對齊等配置項改動
- 最后渲染
- 尺寸計算需要在主線程完成
6.2.3 UIImageView
- 盡量圖像尺寸和UIImageView保持一致,調整圖像大小是比較耗時的操作库正,如果包含在UIScrollView中,耗費更大
6.2.4 UITableView
- 避免漸變、圖像縮放以及離屏渲染(圓角設置)皆看,這些都是相對耗時
- 可以考慮一些小優(yōu)化入:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGPoint velocity = [tableView.panGestureRecognizer velocityInView:self.view];
self.velocity = velocity.y;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (self.velocity > 2000) {
//預覽cell(內容簡單的)
} else {
//真正的cell
}
}
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者