2015-10-15 51 views
1

我听说viewDidLayoutSubviews是我们使用约束条件时改变布局的最佳位置。使用viewDidLayoutSubviews时出现

所以我跳到viewDidLayoutSubviews

我已经创建了三个UIViewsSubViewed他们的SuperView。我没有提到帧计算的代码。

[self.view addSubview:imgMiddleCircle]; 
[self.view addSubview:imgFirstCircle]; 
[self.view addSubview:imgLastCircle]; 

使用这片我添加这些圈子。

现在,当我运行的代码在viewDidLayoutSubviews我得到如下画面:

enter image description here

当我切换到viewWillLayoutSubviews我得到这个屏幕上:

enter image description here

为什么我即使我正在创建三个圈子,我在viewDidLayoutSubviews中增加了两个圈子。

为什么在viewWillLayout给出正确的输出。

+1

'viewDidLayoutSubviews'被多次调用,这就是为什么你看到额外的意见。因此,它不是添加子视图的最佳位置。通常情况下,你需要在'viewDidLoad'中添加子视图,如果你确定你想手动计算框架,那么你只需要'viewDidLayoutSubviews'中的内容' – Alladinian

+0

你的意思是多次调用内部'viewDidLayoutSubviews' ....并且我因为我打开了自动布局,所以无法使用'viewDidLoad'。我正根据现有控件进行计算。在viewDidLoad中,我没有得到现有控件的正确框架 – Dalvik

+1

@RahulMishra在'viewDidLayoutSubviews'中设置框架,并在'viewDidLoad'中添加子视图。 –

回答

3

您应该为viewDidLayoutSubviews被称为多种类型的事实编码。

理想情况下addSubview:应该发生在像viewDidLoad这样的地方,你可以确定它只被调用一次。

您可以创建一个标志,以避免调用addSubview:倍数类型(不是我个人的选择)

否则,尝试做你的计算之前将您设置的代码viewDidLoad并迫使观点来表现自己:

[yourView setNeedsLayout];

[yourView layoutIfNeeded];

2

Apple Documentation

当一个视图控制器的视图边界的变化,认为 调整其子视图的位置,然后系统调用该方法 。但是,调用此方法并不表示视图子视图的各个布局已被调整。每个 子视图负责调整其自己的布局。

您的视图控制器可以覆盖此方法,以便在 视图布置其子视图后进行更改。这个 方法的默认实现什么都不做。

所以,从本质上讲,viewDidLayoutSubiews被创造你的viewController包括像旋转的装置,滚动等,所以,你应该非常小心,与你加入到这个方法的代码的情况下在多次调用,因为它也可能会多次执行。 使用此方法重新定位您的子视图,而不是添加/删除它们。

查看此blog了解更多详情。

相关问题