我正在尝试为某些子视图创建自定义布局。我的文件是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}}及其方法的类引用中所建议的方式做事,我该如何才能使用这两种方法?
答案 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
中进行布局。
希望这些可能有所帮助 快乐的编码