iOS:setFrame不再使用viewDidLoad或viewWillAppear

时间:2012-09-28 18:14:57

标签: ios ios6

我更愿意停用autoresizesSubviews并使用setFrame来放置我的所有子视图。 从iOS 6开始,事情似乎发生了很大变化。 当我在viewDidLoad的视图上调用setFrame时,没有效果。我是从viewWillAppear尝试过的;同样的事情。

setFrame调用可以在willAnimateRotationToInterfaceOrientation中运行,但最初不会像在iOS 5中那样调用。

有人可以澄清我希望从哪里布置我的观点吗?

3 个答案:

答案 0 :(得分:19)

我想你想要从UIViewController布局你的视图。您是否尝试在viewDidLayoutSubviews中执行布局任务:

- (void)viewDidLayoutSubviews

根据Apple的文档:

  

您的视图控制器可以覆盖此方法,以便在视图布局其子视图后进行更改。

由于您的视图本身没有布局其子视图(您不使用自动调整大小,自动布局或layoutSubViews :),您可以在此方法中执行布局任务。

尽管如此,优雅的方法是使用自定义父UIView并在那里执行所有布局,覆盖UIView的layoutSubViews:(除非您以语音方式添加/删除视图)。引自Apple "How View Controllers Participate in the View Layout Process"上的文档:

  

理想情况下,视图本身会执行所有必要的工作来重新定位自己,而不需要视图控制器完全参与该过程。但是,如果视图控制器动态添加和删除视图, Interface Builder中的静态布局可能无法实现。在这种情况下,视图控制器是控制过程的好地方,因为视图本身通常只有场景中其他视图的有限图片。

答案 1 :(得分:3)

如果取消选中Interface Builder中的Autolayout选项,则可以在setFrame中使用viewDidLoad。如果您需要使用自动布局,则需要在viewDidLayoutSubviews:中执行布局任务。

Uncheck Autolayout in Interface Builder

答案 2 :(得分:0)

关于“要求意见自我解决对我来说没有意义。意见无权说出他们应该去哪里。这是控制者的角色,不是吗?”。我认为答案通常是否定的。这是父视图(不是视图控制器),它通常扮演着布置自己的子视图的角色。它通过使用autoresizingMask或autolayout(仅限iOS 6)来实现。或者,您可以通过覆盖父视图的-layoutSubviews方法以编程方式进行布局。

当然,正如Imre所提到的,控制器也可以通过覆盖- (void)viewDidLayoutSubviews来参与布局过程。当我不想将视图控制器的顶级视图子类化以保持简单时,我经常使用这种方法。

最后,我发现这个post非常有用。即使有一些小错误,该帖子提供了视图布局过程的大图。