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

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

这个视图调用是它的子视图(一个UIScrollViewlayoutSubviews 方法,但UIScrollView 不会调用layoutSubviews 来获取它的子视图。这是应该的样子吗?我想如果你在一个视图上调用setNeedsLayout,它会在每个子视图及其子视图上调用layoutSubviews......

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

谢谢。

【问题讨论】:

    标签: objective-c ios cocoa-touch uiview 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 是的,谨慎使用。修改了答案。
    猜你喜欢
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    相关资源
    最近更新 更多