在我的容器控制器中,用户可以平移视图以切换到不同的视图。当平移手势开始时,它会将新视图控制器的视图添加到视图中:view.insertSubView(view:, atIndex:)
经过一番研究,我注意到这个步骤大约需要0.03秒(而其他的都是0.001-0.002秒)。这导致过渡到一点点,这有点烦人。
视图控制器使用故事板在应用程序的开头创建为全局视图。
此外,这仅在第一次加载视图时发生。转换完全都是流利的。
我可以做些什么来预加载视图,以便在第一次加载时不会那么“长”?
修改
环境背景:
var pendingViewController: UIViewController! {
didSet {
if let pending = pendingViewController {
addChildViewController(pending)
let index = view.subviews.count - 1
NSLog("start insert view test")
view.insertSubview(pending.view, atIndex: index)
NSLog("end insert view test")
pending.didMoveToParentViewController(self)
}
}
}
因为它只是在第一次加载视图时才发生,我认为问题可能出现在viewDidLoad
和viewWillAppear
的某个地方。结果如下所示。只有viewDidLoad
花费了少量时间(0.005秒)。在到viewDidLoad
之前有一个0.02秒的间隙,但我不知道它可能是什么。
2015-12-17 15:15:57.116 Valor[777:232799] start insertView view test
2015-12-17 15:15:57.136 Valor[777:232799] start viewDidLoad test
2015-12-17 15:15:57.141 Valor[777:232799] end viewDidLoad test
2015-12-17 15:15:57.142 Valor[777:232799] start viewWillAppear test
2015-12-17 15:15:57.144 Valor[777:232799] end viewWillAppear test
2015-12-17 15:15:57.146 Valor[777:232799] end insertView view test
答案 0 :(得分:2)
使用工具查找慢速代码发生的位置,而不是带有时间戳的日志语句。这将显示(包括系统调用)完全所花费的时间。
由于布局,插入子视图可能会很慢。但是,您的跟踪(例如它)表明创建和加载视图控制器视图所花费的时间。你说这个观点来自故事板。那里有什么?此视图加载时会触发多少其他内容?使用时间分析器,您将能够告诉。它可能是一个简单的属性,你提供一个默认值,而不是一个懒惰的值。
视图控制器使用故事板在应用程序的开头创建为全局视图。
如果是这种情况,那么您可以通过执行类似
之类的操作来强制加载视图控制器的视图let hack = viewcontroller.view
访问视图控制器的view
属性会导致它从故事板中加载视图。
答案 1 :(得分:0)
乍一看,我看到一个奇怪的事情:插入pending.view
的索引。例如,如果视图上的视图计数为5,则表示其子视图的索引从0到4不等。然后,您希望将新子视图放在索引4(= 5 - 1),而其中一个已经打开您的视图哪个索引= 4.AFAICS,您的意思是5而不是4.因此,您应该坚持let index = view.subviews.count
然后在该索引处插入新视图,或者只使用view.addSubview(pending.view)
。我希望这会帮助你。