3

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

当我[self layoutSubviews];显式调用 in 时viewDidLoad,它将-layoutSubviews毫无问题地执行代码。

但是,我读过我不应该-layoutSubviews显式调用,或者调用它,self因为那是一个UIViewController. 我尝试-setNeedsLayout通过这样调用它来实现:[self.view setNeedsLayout]in viewDidLoad,并取出显式调用-layoutSubviews但保留其声明。但这似乎不起作用。

我被链接到一篇关于何时调用 layoutSubviews 的文章,并且似乎应该在我添加子视图时调用它,但这似乎并没有发生在这里。

如果我想要安全,并按照它在类参考及其方法中建议的方式做事UIView,我应该如何才能使用这两种方法?

4

4 回答 4

6

没有-[UIViewController layoutSubviews]or之类的东西-[UIViewController setNeedsLayout]。这些是UIView方法。

如果你想使用这个layoutSubviews系统,你需要继承你的顶层UIView并在那里实现它。默认情况下,它什么也不做。如果您想使用视图控制器布局视图,那么我会将这些方法命名为其他名称(例如layout,因为视图控制器没有“子视图”)以避免与UIView.

于 2012-08-13T17:14:29.410 回答
1

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

于 2014-08-20T23:08:29.493 回答
1

你永远不应该-layoutSubviews直接打电话。这可能对性能有害,但也可能有其他原因。而是调用-setNeedsLayout. 此方法设置一个标志(或布尔值),在下一次绘图传递-layoutSubviews时应调用该方法(几个方法可能会设置此标志,但在时间合适之前它不会强制重绘)。

您的-layoutSubviews实现是否调用-layoutSubviews了超类?

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

于 2012-08-13T17:01:41.227 回答
1

正如@Rob Napier 回答的那样,

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

这很好,所以我们要将UIView& 子类化为UIViewController'view属性的自定义类。它也会起作用,但是对于每个UIViewController.

使用类中提供的&有一种更简单的方法(我们应该遵循的明显方法)。viewWillLayoutSubviewsviewDidLayoutSubviewsUIViewController

顾名思义,它们在之前和之后被调用,在UIView.

希望这些可能有助于快乐编码

于 2015-09-01T07:11:00.003 回答