情景 - 我的视图上有标签,其高度和高度均为width我的方面适合superView的高度和宽度(表示它们的尺寸是可变的,并根据视图而改变)。 我现在必须更改标签的属性。我在一个函数中这样做 -
func ammendViews()
{
noOfStudentsLbl.layer.masksToBounds = true
noOfStudentsLbl.layer.cornerRadius = noOfStudentsLbl.frame.height/2
maleCountLbl.clipsToBounds = true
maleCountLbl.layer.cornerRadius = maleCountLbl.frame.height/2
femaleCountLbl.clipsToBounds = true
femaleCountLbl.layer.cornerRadius = femaleCountLbl.frame.height/2
noOfStudentsLbl.hidden = false
maleCountLbl.hidden = false
femaleCountLbl.hidden = false
}
效果2
案例 - 1(viewDidLoad()& viewWillAppear())
我在viewDidLoad()&中调用了这个函数。 viewWillAppear(),它有效果1。
案例 - 2(viewDidLayoutSubViews())
我在viewDidLayoutSubViews()中调用它,并且更改最初显示为effect1,并在一段时间后更改为effect2。
案例-2(dispatch_async)
然后我在async方法中输入了一个mainQueue作为 -
override func viewWillAppear(animated: Bool)
{
dispatch_async(dispatch_get_main_queue()) {
self.ammendViews()
}
}
这显示效果-2 !!
我的理解 - 由于我的标签尺寸是动态的并且取决于主视图的尺寸,即在设备尺寸上,并且当调用viewWillAppear()和viewDidLoad()时,视图没有正确放置,因此对我的标签只有一半的影响。
在viewDidLayoutSubViews()中调用时,视图已经被放置,因此它进行了更改,但为什么它在中断几秒后生效,我不知道。
当我把它放在
中时,为什么它完美无缺dispatch_async(dispatch_get_main_queue()) {
}
这里我是在异步但在主线程中,所以为什么在我之前的3个案例中直接(非异步)直接执行此操作时不会发生这种情况。
答案 0 :(得分:0)
您的理解是正确的。这些观点尚未在viewDidLoad
和viewWillAppear
中列出。通过将代码放在viewDidLayoutSubviews
中,自动布局已经运行并且视图布局正确,因此现在可以正确设置框架。这是正确的地方。
在使用dispatch_async
的情况下,您将安排该代码稍后在主线程上运行。碰巧的是,当iOS开始运行此代码时,子视图已经布局。如果您将print
放入异步代码和viewDidLayoutSubviews
中,我相信您会发现viewDidLayoutSubviews
将在您的异步代码运行之前完成。