使用viewDidLayoutSubviews时出现
我听说viewDidLayoutSubviews
是我们使用约束条件时改变布局的最佳位置。使用viewDidLayoutSubviews时出现
所以我跳到viewDidLayoutSubviews
我已经创建了三个UIViews
和SubViewed
他们的SuperView。我没有提到帧计算的代码。
[self.view addSubview:imgMiddleCircle];
[self.view addSubview:imgFirstCircle];
[self.view addSubview:imgLastCircle];
使用这片我添加这些圈子。
现在,当我运行的代码在viewDidLayoutSubviews
我得到如下画面:
当我切换到viewWillLayoutSubviews
我得到这个屏幕上:
为什么我即使我正在创建三个圈子,我在viewDidLayoutSubviews
中增加了两个圈子。
为什么在viewWillLayout
给出正确的输出。
您应该为viewDidLayoutSubviews
被称为多种类型的事实编码。
理想情况下addSubview:
应该发生在像viewDidLoad
这样的地方,你可以确定它只被调用一次。
您可以创建一个标志,以避免调用addSubview:
倍数类型(不是我个人的选择)
否则,尝试做你的计算之前将您设置的代码viewDidLoad
并迫使观点来表现自己:
[yourView setNeedsLayout];
[yourView layoutIfNeeded];
当一个视图控制器的视图边界的变化,认为 调整其子视图的位置,然后系统调用该方法 。但是,调用此方法并不表示视图子视图的各个布局已被调整。每个 子视图负责调整其自己的布局。
您的视图控制器可以覆盖此方法,以便在 视图布置其子视图后进行更改。这个 方法的默认实现什么都不做。
所以,从本质上讲,viewDidLayoutSubiews
被创造你的viewController包括像旋转的装置,滚动等,所以,你应该非常小心,与你加入到这个方法的代码的情况下在多次调用,因为它也可能会多次执行。 使用此方法重新定位您的子视图,而不是添加/删除它们。
查看此blog了解更多详情。
'viewDidLayoutSubviews'被多次调用,这就是为什么你看到额外的意见。因此,它不是添加子视图的最佳位置。通常情况下,你需要在'viewDidLoad'中添加子视图,如果你确定你想手动计算框架,那么你只需要'viewDidLayoutSubviews'中的内容' – Alladinian
你的意思是多次调用内部'viewDidLayoutSubviews' ....并且我因为我打开了自动布局,所以无法使用'viewDidLoad'。我正根据现有控件进行计算。在viewDidLoad中,我没有得到现有控件的正确框架 – Dalvik
@RahulMishra在'viewDidLayoutSubviews'中设置框架,并在'viewDidLoad'中添加子视图。 –