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

UI updates behaving differently in different cases

场景 - 我的视图上有标签,其高度和宽度我的方面适合 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 -

效果 2

案例 - 1(viewDidLoad() & viewWillAppear())

我在 viewDidLoad() 和 viewWillAppear() 中调用了这个函数,它产生了效果 1。

案例 - 2(viewDidLayoutSubViews())

我在 viewDidLayoutSubViews() 中调用它,变化最初显示为 effect1,一段时间后变为 effect2。

案例 - 2(dispatch_async)

然后我在异步方法中放入一个 mainQueue 作为 -

override func viewWillAppear(animated: Bool)
    {
        dispatch_async(dispatch_get_main_queue()) {
            self.ammendViews()
        }
        
    }

这显示了 effect-2 !!

我的理解- 由于我的标签尺寸是动态的,并且取决于主视图的尺寸,即设备尺寸,并且当调用 viewWillAppear() 和 viewDidLoad() 时,视图没有正确放置,所以对我的标签只有一半的影响。

在调用 viewDidLayoutSubViews() 时,视图已经放置,因此它进行了更改,但是为什么在中断几秒钟后它就生效了,我不知道。

为什么当我把它放进去时一切都完美无缺

dispatch_async(dispatch_get_main_queue()) {
                    }

我这里是异步的,但是是在主线程里做的,为什么前面3个案例直接在mainQueue里做(不是异步的)都没有呢

你的理解是正确的。 viewDidLoadviewWillAppear 中尚未列出这些视图。通过将您的代码放在 viewDidLayoutSubviews 中,自动布局具有 运行 并且视图布局正确,因此框架现在已正确设置。这是执行此操作的正确位置。

在使用 dispatch_async 的情况下,您稍后将该代码调度到主线程上的 运行。碰巧的是,当 iOS 开始执行 运行 这段代码时,子视图已经布置好了。如果您将 prints 放入您的异步代码和 viewDidLayoutSubviews,我相信您会发现 viewDidLayoutSubviews 将在您的异步代码 运行s.[=17= 之前完成]