UIView 子视图中的 setNeedsLayout
Posted
技术标签:
【中文标题】UIView 子视图中的 setNeedsLayout【英文标题】:setNeedsLayout in UIView subviews 【发布时间】:2011-10-08 09:26:08 【问题描述】:我有一个UIViewController
和willRotateToInterfaceOrientation
,我打电话给[self view] setNeedsLayout];
这个视图调用是它的子视图(一个UIScrollView
)layoutSubviews
方法,但UIScrollView
不会调用layoutSubviews
来获取它的子视图。这是应该的样子吗?我想如果你在一个视图上调用setNeedsLayout
,它会在每个子视图及其子视图上调用layoutSubviews
......
我是否必须手动覆盖UIScrollView
中的layoutsubview
并为每个子视图调用setNeedsDisplay
?
谢谢。
【问题讨论】:
【参考方案1】:我前段时间在我的应用程序中观察到了同样的事情,似乎setNeedsLayout
只影响视图的子视图并且不会向下遍历。如果您使用自定义视图,您可以轻松地对视图进行子类化并遍历 setNeedsLayout
中的子视图并对其执行显式 setNeedsLayout
。
如果您希望它成为默认行为,您可以在类别中覆盖该方法,但我真的不会这样做,因为它会影响所有视图并可能引入性能和其他意外问题。
你可以这样做
@interface UIView (Layout)
- (void)setNeedsLayoutRecursively;
@end
@implementation UIView (Layout)
- (void)setNeedsLayoutRecursively
for (UIView *view in self.subviews)
[view setNeedsLayoutRecursively];
[self setNeedsLayout];
@end
在浏览器中输入,未测试
但是,请注意,这不是好的做法!您应该只更新需要更新的内容。这可能会导致严重的性能损失。谨慎使用!
【讨论】:
谢谢..我希望我不必那样做,想避免那样做。因为我有一个很深的视图层次结构,所以真的不想子视图很多 UIViews。无论如何,非常感谢您的帮助。 优秀的选择加入小码完美解决了我的问题。谢谢! 但是子视图不必担心父视图的状态。只有当子视图的边界发生变化时,才需要重新布置子视图。如果父级的 layoutSubviews(或自动调整大小的掩码)更改了子级的大小,则可能会发生这种情况。在这种情况下,layoutSubviews 会向下传播视图层次结构。 @VaddadiKartick 是的,谨慎使用。修改了答案。以上是关于UIView 子视图中的 setNeedsLayout的主要内容,如果未能解决你的问题,请参考以下文章
如何将 UITableView 作为子视图添加到 xib 中的 UIView?