Swift 插入子视图,以“a”;“长”;时间
在my container controller中,用户可以平移视图以切换到不同的视图。当平移手势开始时,将新视图控制器的视图添加到具有以下内容的视图中:Swift 插入子视图,以“a”;“长”;时间,swift,view,uiviewcontroller,Swift,View,Uiviewcontroller,在my container controller中,用户可以平移视图以切换到不同的视图。当平移手势开始时,将新视图控制器的视图添加到具有以下内容的视图中:view.insertSubView(view:,atIndex:) 在研究了一下之后,我注意到这个步骤大约需要0.03秒(而其他的都是0.001-0.002秒)。这会导致转换变得有点烦人 视图控制器在应用程序开始时使用情节提要创建为全局视图 此外,这仅在第一次加载视图时发生。之后的过渡都很流畅 我可以做些什么来预加载视图,这样在第一次加载视图
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)
}
}
}
因为它只在第一次加载视图时发生,我想问题可能出在viewdiload
和viewwillbeen
的某个地方。结果如下所示。只有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
乍一看,我看到了一件奇怪的事情:插入
pending.view的索引。例如,如果视图的视图数为5,则表示其子视图的索引从0到4不等。然后,您希望将新的子视图放在索引4(=5-1)处,而视图上已有一个索引为4的子视图。AFAICS,你的意思是5而不是4。因此,您应该坚持使用let index=view.subviews.count
,然后在该索引处插入新视图,或者只使用view.addSubview(pending.view)
。我希望这能帮助您解决问题。使用工具找出代码运行缓慢的地方,而不是用时间戳记录语句。这将向您显示(包括系统调用)时间的确切位置
由于布局的原因,插入子视图可能会比较慢。但是,您的跟踪(比如它)表明创建和加载视图控制器的视图所花费的时间。你说这个观点来自故事板。里面有什么?加载此视图时会触发多少其他事件?使用时间探查器,您将能够判断。它可以是一个简单的属性,你给它一个默认值,它可以是一个惰性值
视图控制器在应用程序开始时使用情节提要创建为全局视图
如果是这种情况,则可以通过执行以下操作强制加载视图控制器的视图
let hack = viewcontroller.view
访问视图控制器的视图
属性会导致它从故事板加载视图。能否显示周围的上下文(插入发生的位置)?谢谢,这非常有用。从time profiler的结果中,我可以看到在这30毫秒中发生了什么:17毫秒用于加载故事板元素(表视图、搜索栏和约束),8毫秒用于“viewDidLoad”,另外5毫秒用于插入视图并添加到子视图控制器。似乎我不能改变太多来降低30毫秒,所以我想知道是否有办法在其他地方预加载所有这些?更新。这不是一个我非常自豪的解决方案,但它确实有效谢谢,似乎我也无法预加载它,除非我更改一半的代码。我想我将以编程方式创建视图控制器,以减少加载时间。我希望这能解决问题。从代码加载通常不会比从故事板加载快太多。你可以尝试在手势发生之前添加视图,只要用户需要时就可以显示它。索引只是一个例子,如果我更改了它,我想这无助于缩短加载时间。谢谢。我明白了,但请试试看。我想,在“已获取”索引处插入视图可能会导致冗余的布局和渲染操作。至少不会变得更糟,所以试试吧:)谢谢,我已经在顶部试过了,实际上其他的都试过了;不幸的是,这没有帮助。