《高性能iOS应用开发》用户界面

2018-03-13  本文已影响21人  Yasic

应用以 60 帧每秒运行,意味着有 16 毫秒事件进行下一帧过渡的全部操作,因此要在一个时间循环中将子任务在主线程的累积时间消耗缩到最短。

ViewController

ViewController 生命周期如下图所示

ViewControllerLifeCycle.png

最佳实践:

当 ViewController 的 view 被请求时,loadView 方法会被调用,此时 view 为 nil。

[sampleViewcontroller view];

执行过程中应该尽量缩短在 viewDidLoad 上花费的时间,数据应该提前准备好或者在其他线程进行加载。

视图结构和渲染包括以下步骤

视图可见性

视图可见性有四个生命周期方法

此时页面过渡动画还没开始,视图对用户不可见,启动任何动画都不会生效。

过渡动画大约 300 毫秒。此时可以启动或恢复动画。

视图被覆盖或视图被弹出时触发。

判决方法

    NSInteger index = [self.navigationController.viewControllers indexOfObject:self];
    if (index == NSNotFound) {
        NSLog(@"willDisappear 即将出栈");
    } else {
        NSLog(@"willDisappear 被覆盖");
    }

此时视图已经被从 navigationController 中移除。

视图可见性的最佳实践:

View

视图优化基本规则:

UILabel

UIlabel 的渲染过程如下

如果动态计算出的 UILabel 宽度是容器宽度的一部分,那么要保证宽度可以由一个百分比均匀分配,否则渲染时需要进行反锯齿操作,代价很大。

UIImageView

最佳实践:

UITableView

最佳实践:

UIWebView

自定义视图

自定义视图可以采取复合视图或直接绘制两种方式,直接绘制的性能高,但是维护困难,适合稳定下来的模块。

自注:鉴于利用 drawRect 方式调用 CoreGraphic 方法是在 CPU 中开辟上下文进行绘制后,整个内存区提交给 GPU 渲染,其内存占用会暴增,而从速度角度来讲,创建和切换上下文的时间消耗,与 UIKit 对渲染绘制的优化可能不分伯仲,不能有效论证直接绘制方案一定是最优的,因此能采用 UIKit 尽量采用 UIKit 方式。

自动布局

自动布局使用的 Cassowary 算法复杂度为 O(N),其中 N 为约束数目。自动布局性能上比手动设置 frame 要差。

上一篇 下一篇

猜你喜欢

热点阅读