setNeedsLayout在UIView的子视图

问题描述:

我有一个UIViewControllerwillRotateToInterfaceOrientation,我打电话[self view] setNeedsLayout];setNeedsLayout在UIView的子视图

这一观点调用的它的子视图的(一个UIScrollViewlayoutSubviews方法,但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 

在浏览器中键入的,没有测试

+0

Thanks..I希望我没有做到这一点,要避免这种情况。因为我有一个深层次的视图层次结构,所以不想真正地去查看大量的UIViews。无论如何,非常感谢您的帮助。 – 0xSina

+0

优秀的小选择性小码,完美地解决了我的问题。谢谢! –

+0

但是,孩子的意见不应该担心父母的状态。只有当子视图边界发生变化时,才需要重新布置子视图。如果父母的layoutSubviews(或自动调整大小掩码)更改孩子的大小,就会发生这种情况。在这种情况下,layoutSubviews向下传播视图层次结构。 –