UIView子视图中的setNeedsLayout

0xS*_*ina 4 cocoa-touch objective-c uiview ios setneedsdisplay

我有一个UIViewControllerwillRotateToInterfaceOrientation,我打电话[self view] setNeedsLayout];

这个视图调用它是子视图的(a UIScrollView)layoutSubviews方法,但UIScrollView不会调用layoutSubviews它的子视图.这是它的假设吗?我想如果你打电话setNeedsLayout给一个视图,它会调用layoutSubviews每个子视图和他们的子视图,然后...

我一定要手动,覆盖layoutsubviewUIScrollView并调用setNeedsDisplay每个子视图?

谢谢.

Eri*_*ner 5

我前段时间在我的应用程序中观察到同样的事情,似乎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
Run Code Online (Sandbox Code Playgroud)

在浏览器中输入,未经过测试