为什么不调用-layoutSubviews?

时间:2012-08-13 16:55:54

标签: objective-c ios cocoa-touch layoutsubviews

我正在尝试为某些子视图创建自定义布局。我的文件是ViewController,因此我必须将其视图称为self.view。子视图是self.view的子视图。

当我在[self layoutSubviews];中明确地呼叫viewDidLoad时,它会毫无问题地执行-layoutSubviews中的代码。

但是,我已经读过,我不应该明确地致电-layoutSubviews,或者在self上致电UIViewController,因为那是-setNeedsLayout。我尝试在[self.view setNeedsLayout]中调用viewDidLoad来实现-layoutSubviews,然后取出UIView的显式调用,但保留其声明。但这似乎不起作用。

我与an article about when layoutSubviews is called相关联,似乎应该在添加子视图时调用它,但这似乎不会发生在这里。

如果我想要安全,并按照它在{{1}}及其方法的类引用中所建议的方式做事,我该如何才能使用这两种方法?

4 个答案:

答案 0 :(得分:6)

没有-[UIViewController layoutSubviews]-[UIViewController setNeedsLayout]这样的事情。这些是UIView方法。

如果要使用layoutSubviews系统,则需要将顶级UIView子类化并在那里实现。默认情况下,它什么都不做。如果你想使用视图控制器来布局你的视图,那么我会将这些方法命名为其他东西(比如layout,因为视图控制器没有“子视图”)以避免与UIView混淆。

答案 1 :(得分:1)

您不应该直接致电-layoutSubviews。这可能对性能有害,但其他原因也可能适用。而是致电-setNeedsLayout。此方法设置一个标志(或布尔值),在下一个绘图过程中,应调用-layoutSubviews方法(多个方法可能会设置此标志,但在时间正确之前不会强制重绘)。

你的-layoutSubviews实现是否在超类上调用-layoutSubviews

也许你应该展示一些代码,以便我们可以帮助你进一步解决这个问题。

答案 2 :(得分:1)

您可以在 - (void)viewWillLayoutSubviews 方法中使用与布局相关的代码,并调用 [self.viewControllerObject.view setNeedsLayout] ,无论您需要布局子视图viewControllerObject。

答案 3 :(得分:1)

@Rob Napier回答说,

  

没有 - [UIViewController layoutSubviews]或 - [UIViewController setNeedsLayout]。这些是UIView方法。

这很好,所以我们即将继承UIView&将其指定为UIViewController view媒体资源的自定义类。它也会起作用,但非常冗长。每个UIViewController都要做太多事情。

使用viewWillLayoutSubviews&有一种更简单的方法(明显的方式我们应该遵循UIViewController课程中提供了viewDidLayoutSubviews

顾名思义,他们之前被称为&之后,在UIView中进行布局。

希望这些可能有所帮助 快乐的编码