主要討論如火如何最小化更新UI所需的時間。
視圖控制器的生命週期: php
建立試圖控制器時須要遵循的基本最佳實踐:html
視圖初始化時會涉及兩個方法--loadview和viewDidLoad. 當添加一個新的視圖控制器時,經過Xcode生成的模板代碼只有viewDidLoad方法。當視圖控制器的view被請求時,loadview方法會被調用,但由於它還未被建立,因此會是nil。ios
三種加載視圖方式:git
若是經過覆寫loadview方法建立了自定義UIgithub
iOS用戶界面:Storyboards vs. NIBs vs. Custom Code http://www.jianshu.com/p/10dd75d34a20web
視圖結構和渲染包括如下步驟: (1)構造子視圖。 (2)計算並提供約束。 (3)爲子視圖遞歸地執行步驟1和步驟2. (4)遞歸渲染 viewDidAppear:方法會由於過分動畫的緣由在約300毫秒後被調用。swift
視圖控制器提供了4個生命週期方法,以接受有關視圖可視性的通知。數組
viewWillAppear:當視圖層級已經準備好,且視圖即將被放入視圖窗口時,此方法會被調用。 在這個時刻,過渡動畫還未開始,視圖對終端用戶也是不可見的。不要啓動任何視圖動畫,由於沒有任何做用。緩存
viewDidAppear: 當視圖在視圖窗口展現出來,且過渡動畫完成後,此方法會被調用。 啓動或恢復任何想要呈現給用戶的視圖動畫。服務器
viewWithDisappear:該方法表示視圖將要從屏幕上隱藏起來。這多是由於其餘視圖控制器想要接管屏幕,或該視圖控制器將要出棧。此方法被調用時,沒有辦法可以直接判斷這是由當前視圖控制器要出棧仍是其餘視圖控制器入棧致使的。區分的惟一方法是掃描當前視圖控制器navigationController的viewController屬性
NSInteger index = [self.navigationController.viewControllers indexOfObject:self]; if(index == NSNotFound){ //即將出棧,銷燬 }else{ //只是保存狀態,暫停 }
高效使用生命週期事件的最佳實踐:
基本規則:
(1)使用字體、字體類型以及要被渲染的文本時,計算須要的像素數目。這是一個消耗較大的過程,應儘量少地去作。 (2)檢查要被渲染的寬度。 (3)檢查numberOfLines,計算將要展現的行數。 (4)sizeToFit是否被調用?若是是,計算高度。 (5)若是sizeToFit沒有被調用,檢查當前的內容可否在給定的高度下展現出來。 (6)若是frame不夠,使用lineBreakMode肯定隱藏或截斷的位置。 (7)使用字典、類型及顏色來渲染最終展現的文本。
渲染按鈕的方式:
選項 | 優勢 | 缺點 |
---|---|---|
自定義文本 | 最簡單的方式,可直接使用 | 一般是比較呆板,毫無裝飾的按鈕 |
全尺寸資源 | 可自定義的背景 無需代碼便可實現 可實現A/B測試—圖像可 在運行試驗時下載 | 圖片打包在應用中,致使包變大 |
可變大小資源 | 可自定義的背景 無需代碼便可實現 <div>可實現A/B測試—圖像可</div> <div>在運行試驗時下載</div><div>包大小的增量相對較小</div> | 資源的任何更改可能都須要從新計算 重置UIEdgeInsets值 |
使用CALayer和 貝塞爾路徑定義繪製 | 徹底是自定義繪圖 | 任何格式的更改或升級均可能須要更新 應用 |
iOS仍舊不支持GIF動畫,只能建立animationImages的一個數組來存放能夠生成動畫的圖片。或使用自定義編碼和第三方庫。 自定義編碼:http://www.imagemagick.org/script/index.php 第三方庫:https://github.com/mattt/AnimatedGIFImageSerialization
使用UIimage和UIimageview的最佳實踐:
最佳實踐:
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{ CGPoint velocity = [self.tableView.panGestureRecognizer velocityInView:self.view]; self.velocity = velocity; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (fabs(self.velocity.y) > 2000){ //返回界面外殼 }else{ //返回真正的單元格 } }
UIWebView是用於渲染未知或動態內容的最多見視圖。一般狀況下,會將web視圖指向一些內嵌的HTML或web URL. 經常使用場景:
須要展現較小的富文本,使用UIlabel的NSAttributedString.
最佳實踐:
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { if ([NSURLErrorDomain isEqualToString:error.domain]){ switch (error.code) { case NSURLErrorBadURL: //處理錯誤的URL break; case NSURLErrorTimedOut: //處理超時 break; case NSURLErrorUnknown: //未知 break; //其餘。。。 default: break; } } }
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if (self.shouldValidate){ [NSURLConnection connectionWithRequest:request delegate:self]; return NO; } return YES; } -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ NSInteger status = [(NSHTTPURLResponse*)response statusCode]; if (status >= 400){ //展現警報或隱藏web view ---不要展現錯誤的網頁 }else{ self.shouldValidate = YES; [self.webView loadRequest:connection.originalRequest]; } }
嵌入的UIWebView的容器應該提供一下元素。
1.導航按鈕。 2.重載按鈕。 3.取消按鈕,用於取消當前正在加載的頁面。 4.用於展現標題的UILable. 5.退出web view的關閉按鈕。
簡單複合視圖UI的基本實現可能包含如下內容: (1)UIImageView做爲頭像圖片。 (2)用UIlabel的NSAttributedText展現用戶名稱。 (3)UITextView,展現主要內容,由於裏面可能包含連接。 (4)通常數據展現UILable。
自定義視圖則經過在drawRect:中直接繪製所有的元素。
1.複合視圖 建立一個UITableViewCell的子類,勾選XIB file。而後直接在XIB排列所需元素。 針對複合視圖,在動畫過程當中使用視圖光柵化http://swift.diagon.me/shouldRasterize/
2.直接繪製 不勾選XIB文件選項,覆蓋drawRect:方法以自定義渲染元素。
優缺點比較:運行時性能和代碼維護 *直接繪圖的自定義視圖中的運行時性能更好。(經過首次初始化時間,後續初始化,滾動後的首次初始化,滾動後的第二次初始化,重用等對比) *從維護的角度來看,代碼會難以維護和發展。一旦應用穩定下來,能夠比較明確的將複合UI換成直接繪圖。
自動佈局使用本地約束(元素彼此之間的位置關係)會比使用全局約束(相對於父視圖的位置)更快。 自動佈局衡量展現視圖和渲染視圖所需的時間,若是超過了閾值,應該考慮使用自定義代碼。閾值根據具體的應用而定。
ppi(像素密度)不是點到像素的比例。 尺寸類別:https://isux.tencent.com/ios9-guideline-ch1.html 尺寸類須要自動佈局。若是由於性能緣由不選擇使用自動佈局,那就不能使用尺寸類
交互式通知,容許用戶提供一個針對輸入的快速響應。 交互式通知的可能動做:
iOS8可用的應用擴展: