UIView子视图中的setNeedsLayout

时间:2011-10-08 09:26:08

标签: objective-c ios cocoa-touch uiview setneedsdisplay

我有一个UIViewController,在willRotateToInterfaceOrientation,我正在呼叫[self view] setNeedsLayout];

此视图调用是子视图(UIScrollViewlayoutSubviews方法,但UIScrollView不会为其子视图调用layoutSubviews。这是它的假设吗?我想如果您在某个视图上调用setNeedsLayout,它会在每个子视图及其子视图上调用layoutSubviews,并在...

我是否必须手动覆盖layoutsubview中的UIScrollView并为每个子视图调用setNeedsDisplay

感谢。

1 个答案:

答案 0 :(得分: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

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