Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UI更新在不同情况下表现不同_Ios_Objective C_Swift_Grand Central Dispatch - Fatal编程技术网

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

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

场景-我的视图上有标签,标签的高度和宽度与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()&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