setNeedsLayout在UIView的子视图
问题描述:
我有一个UIViewController
和willRotateToInterfaceOrientation
,我打电话[self view] setNeedsLayout];
setNeedsLayout在UIView的子视图
这一观点调用的它的子视图的(一个UIScrollView
)layoutSubviews
方法,但UIScrollView
没有调用layoutSubviews
为它的子视图。这是怎么想的?我想,如果你在查看通话setNeedsLayout
,它会调用layoutSubviews
对每一个subivew及其子视图和......
我一定要手动,在UIScrollView
覆盖layoutsubview
,并呼吁setNeedsDisplay
每个子视图?
谢谢。
答
我前段时间在我的应用程序中观察到同样的情况,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
在浏览器中键入的,没有测试
Thanks..I希望我没有做到这一点,要避免这种情况。因为我有一个深层次的视图层次结构,所以不想真正地去查看大量的UIViews。无论如何,非常感谢您的帮助。 – 0xSina
优秀的小选择性小码,完美地解决了我的问题。谢谢! –
但是,孩子的意见不应该担心父母的状态。只有当子视图边界发生变化时,才需要重新布置子视图。如果父母的layoutSubviews(或自动调整大小掩码)更改孩子的大小,就会发生这种情况。在这种情况下,layoutSubviews向下传播视图层次结构。 –