UIView 子视图中的 setNeedsLayout

Posted

技术标签:

【中文标题】UIView 子视图中的 setNeedsLayout【英文标题】:setNeedsLayout in UIView subviews 【发布时间】:2011-10-08 09:26:08 【问题描述】:

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

这个视图调用是它的子视图(一个UIScrollViewlayoutSubviews 方法,但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的主要内容,如果未能解决你的问题,请参考以下文章

根据子视图大小调整 XIB 中的 UIView 大小

UIView 中的自动替换子视图

如何将 UITableView 作为子视图添加到 xib 中的 UIView?

使用 IOS 中的约束将 UIView 中的子视图居中

将 UITextView 添加为 UIView 中的子视图,然后添加到 UIScrollView

从 iOS 中的 UIView 子视图重新加载时 UITableView 未重新加载