主要讨论如火如何最小化更新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可用的应用扩展: