ios - AutoLayout:UIView 中的 UIView 的框架不正确

标签 ios cocoa-touch uiview autolayout uistoryboard

我正在 Storyboard 中使用 AutoLayout,一切似乎都很顺利。但是,当我将一个 UIView 放入另一个 UIView 并将我想要的所有约束应用于容器及其子项时,我注意到 viewDidLayoutSubviews: 中的框架不正确。它不是我希望根据我的约束计算的框架,而是一些令人作呕的大框架(尽管在正确的原点)。例如,我得到的不是 {{26, 10}, {444, 10}} 的帧,而是 {{0, 0}, {320, 568}} em>。

奇怪的是,当我将子 UIView 置于另一个 UIView 中时,这发生在子 UIView 中,该 UIView 对其应用了一些与其父 View (即 View Controller 的 View )相关的约束。因为我的印象是我可以根据我在方法 viewDidLayoutSubviews: 中的约束来正确布置我的 View ,所以我很困惑为什么会这样。

我是否做出了错误的假设?如果有人可以帮助我指出正确的方向,我将不胜感激。谢谢!

注意:如果我在 viewDidAppear: 中进行正确的依赖于帧的设置,这个问题就完全解决了,但这对我来说是一个不太令人满意的解决方法。

最佳答案

自动布局对边界的更改不一定在 -viewDidLayoutSubviews 中完成。如放入 "Advance Auto Layout Toolbox" :

Constraint-based layout is an iterative process. The layout pass can make changes to the constraints based on the previous layout solution, which again triggers updating the constraints following another layout pass.

-viewDidLayoutSubviews 的文档 notes with emphasis in the original :

However, this method being called does not indicate that the individual layouts of the view's subviews have been adjusted.

因此 subview 中的布局和基于约束的迭代可以继续调整它们的框架,但是如果 ViewController 的 View 边界没有改变,它的 -viewWillLayoutSubviews 将不会被调用。

既然你说你的设置是“依赖于帧的”,你有几个选择。

<罢工>1。在 -viewWillAppear 中进行设置。比 -viewDidAppear 更好,并且由于您确实需要在完成所有布局之后完成所有操作,但在它出现在屏幕上之前,这是该方法存在的合理原因。如果相关,您可以尝试调用 -isMovingToParentViewControllerDetermining Why A View's Appearance Changed 中所述.

编辑:-viewWillAppear 在将 View 添加到 View 层次结构之前调用,因此布局可能不会 完成。对不起大家,幸好有了 Swift UI,我们正在从过程式布局转向声明式布局,这就是原因。


  1. 在您需要的 View 上调用 -layoutIfNeeded,以便在您需要的地方获得正确的值。因为这会进行布局工作,所以它很昂贵,并且如果在其自己的布局过程中触发,可能会导致重复性工作甚至无限循环。但如果需要将某些值与自动布局同步以便使用它们,它会很有用。

如果这不起作用,请告诉我们,这可能与约束本身的性质或其他原因有关。自动布局迭代可能很难同步。祝你好运。

关于ios - AutoLayout:UIView 中的 UIView 的框架不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28601742/

相关文章:

ios - 获取单个 NSDateComponents 的 2 个日期之间的确切差异

ios - MediaPlayer.framework (MPMoviePlayerController) 从需要访问凭据的 URL 播放电影

ios - 从另一个 ViewController 在 subview 上调用 AnimateWithDuration 时出错

iphone - 如何在 UINavigationBar 上获取 'matte' 颜色?

objective-c - 我收到一条错误消息,内容为 "Use of Undeclared Identifier ' 事件'”

iOS View.layer.border 有白边

ios - 从录制的声音中消除已知音频,通过反卷积估计背景声级

ios - Xcode 12 SwiftUI 应用程序因 UIRequiredDeviceCapabilities plist 键而被拒绝

ios - dequeueReusableCellWithIdentifier 不释放数据

iPhone 不使用 MessageUI 发送电子邮件