【问题标题】:How to force layoutSubviews of UIView?如何强制 UIView 的 layoutSubviews?
【发布时间】:2011-11-26 02:15:54
【问题描述】:

我有一个自定义 UIView,它有一个专门的、手动设置的纵向和横向框架,因为 autoresizingMasks 在我的情况下不起作用。

我把这个框架设置在:

 - (void)viewWillAppear:(BOOL)animated

它按预期工作。

我现在的问题是,我的 UIView 还具有子视图,这些子视图也有专门的纵向/横向位置。

我将这些子视图放置在:

- (void)layoutSubviews

如果我现在让我的 viewController 处于 eg 纵向,在另一个 viewController 上旋转到横向,然后回到这个 viewController 我看到我的视图已正确调整大小,但我的视图的子视图,在 layoutSubviews 中定位的尚未重新定位,而是在视图出现后以动画方式调整大小。

我在 viewDidAppear 中什么也没做,我已经尝试调用

 - (void)layoutIfNeeded

还有:

 - (void)setNeedsLayout

viewWillAppear,但似乎没有任何改变。

任何想法我做错了什么?

【问题讨论】:

    标签: ios iphone uiview uiviewcontroller layoutsubviews


    【解决方案1】:

    今天遇到了类似的问题。我通过第一次调用解决了它

    • -setNeedsLayout:设置视图需要布局的标志,然后调用
    • -layoutIfNeeded:立即检查标志并 - 因为它是之前手动设置的 - 结果 layoutSubviews 被调用。

    不知道这是否是最好的方法,但它有效;)

    【讨论】:

    • 这个方法似乎比只调用 self.view.layoutSubviews() 效果更好
    • 调用 layoutSubviews 将使用您设置的任何约束来排列子视图。如果您正在做的事情不使用约束,则需要 setNeedsLayout 然后 layoutIfNeeded 以立即强制更新布局。
    【解决方案2】:

    我建议在 viewDidLoad 中设置初始框架,然后更改视图框架以更改方向

    - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
    

    您不需要 layoutSubviews 中的任何显式动画(不确定是否有,但听起来很像),因为任何帧更改都会同步到旋转动画。

    当离开屏幕时,方向仍应旋转,因此当再次转换回屏幕时,您的视图应正确定位。

    我还建议观看 WWDC 2010 Session 123 “Building Animation Driven UI”,它更详细地介绍了这些内容。

    【讨论】:

    • 我使用 willAnimateRotationToInterfaceOrientation 在屏幕上旋转我的视图,它工作得很好。我在 layoutSubviews 中也没有明确的动画,这就是问题所在。我没有明确地为视图设置动画,但它们仍然是动画。 “离开屏幕时,方向仍应旋转”..真的吗?从来没有为我工作过,我总是不得不在 viewWillAppear 中重新定位。不过,感谢会议的提示,将尽快观看此会议。
    【解决方案3】:

    Swift 3 @iOS 10.1

    override func viewWillAppear(animated: Bool){
    
        super.viewWillAppear(animated)
        view.setNeedsLayout()
    }
    

    完美运行

    【讨论】:

    • Apple:如果你重写了这个方法,你必须在你的实现中调用 super。所以你真的应该打电话给 super,如果它没有工作的话。
    【解决方案4】:

    对我来说有效的是 [self.view setNeedsDisplay] 。这会在整个视图上调用重绘。您还可以通过在特定视图上调用 setNeedsDisplay 来重绘选定视图,在我的案例中我这样做了,并且效果很好。

    【讨论】:

    • 这会导致调用drawRect: 方法。
    猜你喜欢
    • 2021-07-29
    • 2011-02-28
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    相关资源
    最近更新 更多