UI更新在不同情况下表现不同

时间:2016-04-28 12:39:12

标签: ios objective-c swift grand-central-dispatch

情景 - 我的视图上有标签,其高度和高度均为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


}

效果1 - enter image description here

效果2

enter image description here

案例 - 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个案例中直接(非异步)直接执行此操作时不会发生这种情况。

1 个答案:

答案 0 :(得分:0)

您的理解是正确的。这些观点尚未在viewDidLoadviewWillAppear中列出。通过将代码放在viewDidLayoutSubviews中,自动布局已经运行并且视图布局正确,因此现在可以正确设置框架。这是正确的地方。

在使用dispatch_async的情况下,您将安排该代码稍后在主线程上运行。碰巧的是,当iOS开始运行此代码时,子视图已经布局。如果您将print放入异步代码和viewDidLayoutSubviews中,我相信您会发现viewDidLayoutSubviews将在您的异步代码运行之前完成。