Ios UI更新在不同情况下表现不同
场景-我的视图上有标签,标签的高度和宽度与superView的高度和宽度相匹配(这表示标签的尺寸是可变的,并随视图而变化)。我现在必须更改标签的属性。我在函数中这样做-Ios UI更新在不同情况下表现不同,ios,objective-c,swift,grand-central-dispatch,Ios,Objective C,Swift,Grand Central Dispatch,场景-我的视图上有标签,标签的高度和宽度与superView的高度和宽度相匹配(这表示标签的尺寸是可变的,并随视图而变化)。我现在必须更改标签的属性。我在函数中这样做- func ammendViews() { noOfStudentsLbl.layer.masksToBounds = true noOfStudentsLbl.layer.cornerRadius = noOfStudentsLbl.frame.height/2 maleCountLbl.clipsToB
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
}
效果1-
效果2
案例-1(viewDidLoad()&ViewWillAspect())
我在viewDidLoad()和viewWillAspect()中调用了这个函数,它具有effect1
案例-2(viewDidLayoutSubViews())
我在viewDidLayoutSubViews()中调用了它,更改最初显示为effect1,一段时间后更改为effect2
案例2(异步调度)
然后我在异步方法中放入一个mainQueue,如下所示-
override func viewWillAppear(animated: Bool)
{
dispatch_async(dispatch_get_main_queue()) {
self.ammendViews()
}
}
这项工作显示出效果-2
我的理解-
由于我的标签的尺寸是动态的,并且取决于主视图的尺寸,即设备的尺寸,并且当调用ViewWillExample()和viewDidLoad()时,视图没有正确放置,因此对我的标签只有一半的影响
在调用viewDidLayoutSubViews()时,视图已经放置,因此它进行了更改,但为什么在中断几秒钟后它才生效,我不知道
为什么当我把它放进去的时候它工作得很完美
dispatch_async(dispatch_get_main_queue()) {
}
在这里,我是在主线程中异步执行的,但在前3种情况下,为什么我在mainQueue中直接执行(非异步)时没有发生这种情况呢。您的理解是正确的。视图尚未在
viewDidLoad
中布局,并且视图将出现。通过将代码放置在viewDidLayoutSubviews
中,自动布局已运行,视图布局正确,因此框架现在已正确设置。这是进行此操作的正确位置
在使用dispatch\u async
的情况下,您正在计划稍后在主线程上运行该代码。碰巧,当iOS开始运行这段代码时,子视图已经布置好了。如果您将print
s放入异步代码和viewdilayoutsubviews
,我相信您会发现viewdilayoutsubviews
将在异步代码运行之前完成。您的理解是正确的。视图尚未在viewDidLoad
中布局,并且视图将出现。通过将代码放置在viewDidLayoutSubviews
中,自动布局已运行,视图布局正确,因此框架现在已正确设置。这是进行此操作的正确位置
在使用dispatch\u async
的情况下,您正在计划稍后在主线程上运行该代码。碰巧,当iOS开始运行这段代码时,子视图已经布置好了。如果在异步代码和viewDidLayoutSubviews中放置print
s,我相信您会发现viewDidLayoutSubviews
将在异步代码运行之前完成。但是viewDidLayoutSubviews也有一些缺陷。我在问题中已经解释过了。为什么?发生了一些奇怪的事情。你是如何设计你的用户界面的?故事板或代码。确保UI工作在主线程上完成。如果要在代码中布局UI,可能需要调用layoutifneed
。但是viewDidLayoutSubviews也有一些缺陷。我在问题中已经解释过了。为什么?发生了一些奇怪的事情。你是如何设计你的用户界面的?故事板或代码。确保UI工作在主线程上完成。如果要在代码中布局UI,可能需要调用layoutifneed
。