六.用户界面

阅读:352 2019-03-19 14:43:53 来源:新网

主要讨论如火如何最小化更新ui所需的时间。6.1视图控制器

视图控制器的生命周期:

创建试图控制器时需要遵循的基本最佳实践:

视图初始化时会涉及两个方法--loadview和viewdidload.当添加一个新的视图控制器时,通过xcode生成的模板代码只有viewdidload方法。当视图控制器的view被请求时,loadview方法会被调用,但因为它还未被创建,所以会是nil。

三种加载视图方式:

如果通过覆写loadview方法创建了自定义ui

ios用户界面:storyboardsvs.nibsvs.customcodehttp://www.jianshu.com/p/10dd75d34a20

视图结构和渲染包括以下步骤:(1)构造子视图。(2)计算并提供约束。(3)为子视图递归地执行步骤1和步骤2.(4)递归渲染viewdidappear:方法会因为过度动画的原因在约300毫秒后被调用。

视图控制器提供了4个生命周期方法,以接受有关视图可视性的通知。

viewwillappear:当视图层级已经准备好,且视图即将被放入视图窗口时,此方法会被调用。在这个时刻,过渡动画还未开始,视图对终端用户也是不可见的。不要启动任何视图动画,因为没有任何作用。

viewdidappear:当视图在视图窗口展示出来,且过渡动画完成后,此方法会被调用。启动或恢复任何想要呈现给用户的视图动画。

viewwithdisappear:该方法表示视图将要从屏幕上隐藏起来。这可能是因为其他视图控制器想要接管屏幕,或该视图控制器将要出栈。此方法被调用时,没有办法能够直接判断这是由当前视图控制器要出栈还是其他视图控制器入栈导致的。区分的唯一方法是扫描当前视图控制器navigationcontroller的viewcontroller属性

nsintegerindex=[self.navigationcontroller.viewcontrollersindexofobject:self];if(index==nsnotfound){//即将出栈,销毁}else{//只是保存状态,暂停}viewdiddisappear:当上一个/下一个视图控制器的过渡动画完成时,此方法会被调用。

高效使用生命周期事件的最佳实践:

基本规则:

(1)使用字体、字体类型以及要被渲染的文本时,计算需要的像素数目。这是一个消耗较大的过程,应尽可能少地去做。(2)检查要被渲染的宽度。(3)检查numberoflines,计算将要展示的行数。(4)sizetofit是否被调用?如果是,计算高度。(5)如果sizetofit没有被调用,检查当前的内容能否在给定的高度下展示出来。(6)如果frame不够,使用linebreakmode确定隐藏或截断的位置。(7)使用字典、类型及颜色来渲染最终展示的文本。

渲染按钮的方式:

ios仍旧不支持gif动画,只能创建animationimages的一个数组来存放可以生成动画的图片。或使用自定义编码和第三方库。自定义编码:http://www.imagemagick.org/script/index.php第三方库:https://github.com/mattt/animatedgifimageserialization

使用uiimage和uiimageview的最佳实践:

最佳实践:

-(void)scrollviewdidscroll:(uiscrollview*)scrollview{cgpointvelocity=[self.tableview.pangesturerecognizervelocityinview:self.view];self.velocity=velocity;}-(uitableviewcell*)tableview:(uitableview*)tableviewcellforrowatindexpath:(nsindexpath*)indexpath{if(fabs(self.velocity.y)>2000){//返回界面外壳}else{//返回真正的单元格}}避免渐变、图像缩放以及任何屏幕外的绘制。6.2.5uiwebview(ios7),wkwebview(ios8),sfsafariviewcontroller(ios9)

uiwebview是用于渲染未知或动态内容的最常见视图。通常情况下,会将web视图指向一些内嵌的html或weburl.常用场景:

需要展示较小的富文本,使用uilabel的nsattributedstring.

最佳实践:

-(void)webview:(uiwebview*)webviewdidfailloadwitherror:(nserror*)error{if([nsurlerrordomainisequaltostring:error.domain]){switch(error.code){casensurlerrorbadurl://处理错误的urlbreak;casensurlerrortimedout://处理超时break;casensurlerrorunknown://未知break;//其他。。。default:break;}}}uiwebview不会通知任何的http协议错误,例如响应是404或500错误。所以需要出发两次调用,第一次使用自定义的nsurlconnection调用,然后是通过webview的调用。

-(bool)webview:(uiwebview*)webviewshouldstartloadwithrequest:(nsurlrequest*)requestnavigationtype:(uiwebviewnavigationtype)navigationtype{if(self.shouldvalidate){[nsurlconnectionconnectionwithrequest:requestdelegate:self];returnno;}returnyes;}-(void)connection:(nsurlconnection*)connectiondidreceiveresponse:(nsurlresponse*)response{nsintegerstatus=[(nshttpurlresponse*)responsestatuscode];if(status>=400){//展示警报或隐藏webview---不要展示错误的网页}else{self.shouldvalidate=yes;[self.webviewloadrequest:connection.originalrequest];}}

嵌入的uiwebview的容器应该提供一下元素。

1.导航按钮。2.重载按钮。3.取消按钮,用于取消当前正在加载的页面。4.用于展示标题的uilable.5.退出webview的关闭按钮。

简单复合视图ui的基本实现可能包含以下内容:(1)uiimageview作为头像图片。(2)用uilabel的nsattributedtext展示用户名称。(3)uitextview,展示主要内容,因为里面可能包含链接。(4)一般数据展示uilable。

自定义视图则通过在drawrect:中直接绘制全部的元素。

1.复合视图创建一个uitableviewcell的子类,勾选xibfile。然后直接在xib排列所需元素。针对复合视图,在动画过程中使用视图光栅化http://swift.diagon.me/shouldrasterize/

2.直接绘制不勾选xib文件选项,覆盖drawrect:方法以自定义渲染元素。

优缺点比较:运行时性能和代码维护*直接绘图的自定义视图中的运行时性能更好。(通过首次初始化时间,后续初始化,滚动后的首次初始化,滚动后的第二次初始化,重用等对比)*从维护的角度来看,代码会难以维护和发展。一旦应用稳定下来,可以比较明确的将复合ui换成直接绘图。

自动布局使用本地约束(元素彼此之间的位置关系)会比使用全局约束(相对于父视图的位置)更快。自动布局衡量展示视图和渲染视图所需的时间,如果超过了阈值,应该考虑使用自定义代码。阈值根据具体的应用而定。

ppi(像素密度)不是点到像素的比例。尺寸类别:https://isux.tencent.com/ios9-guideline-ch1.html尺寸类需要自动布局。如果因为性能原因不选择使用自动布局,那就不能使用尺寸类

交互式通知,允许用户提供一个针对输入的快速响应。交互式通知的可能动作:

ios8可用的应用扩展:

相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服