UITableView header 内容器视图的自动布局约束因不同设备而损坏
Auto Layout constraints for container view inside UITableView header broken for different devices
我有一个对我来说没有意义的问题。我有以下设置:
| UITableView |
|| UITableView header ||
||| UIView |||
所以在我的 UITableView header 中,我有一个容器视图,它的父视图具有前导、尾随和顶部约束。一切都针对我的测试设备大小(即 iPhone 8)进行了正确设置。如果我将测试设备更改为 iPhone 8 Plus,我会得到一个奇怪的尾随约束偏移量 - 右边缘 39pt,这正是 iPhone 8 加上点宽度和 iPhone 8.
当我在 Xcode 中的设备之间切换并发现尾随约束不正确时,我只是自己进行了调整(将尾随更改为 1,然后再更改为 0),问题就消失了设备。
最初我认为这是 Xcode 中的错误,但当我在设备上测试时问题仍然存在。
我尝试设置一个新的视图控制器并添加相同的元素但没有效果。
我附上屏幕截图以使我的问题更清楚。
之前:调整所需的约束
之后: 切换到不同大小的设备
将此添加为答案是因为评论太多了 - 尽管它实际上只是一种确认,而不是解决方案。
好的 - 查看了您的项目。
我会说这是一个 IB / Storyboard 错误,我在其他情况下也见过这种错误。如果您更改 View As...
设备,框架不会立即更新。
但是,如果您更改任何会导致布局更新的内容 - 例如临时更改视图的背景颜色或标签的字体大小 - 一切都应该卡入到位。
您还会注意到,如果您 select 一个元素并稍微移动它,Update Frames
按钮/菜单项就会启用...这也会正确更新框架。
注意: 当我 运行 应用程序时,无论布局在 Storyboard 中的外观如何,约束在 运行 时正确调整视图大小.
起初我接受了 DonMag 的回答(感谢您的宝贵时间),因为这似乎确实是一个 Xcode Interface Builder 错误。当我进一步调查我提到的场景时,自动布局约束不会在我需要时更新布局,因此没有给我正确的 view.bounds
。
我尝试在 viewDidLayoutSubviews()
中获取它,但也没有成功 - 它仍然为我提供了适合其他设备的尺寸。
诀窍是在使用视图边界之前调用 view.layoutIfNeeded()
。它所做的是立即更新视图的布局。因此,您可以访问所需视图的边界。
我有一个对我来说没有意义的问题。我有以下设置:
| UITableView |
|| UITableView header ||
||| UIView |||
所以在我的 UITableView header 中,我有一个容器视图,它的父视图具有前导、尾随和顶部约束。一切都针对我的测试设备大小(即 iPhone 8)进行了正确设置。如果我将测试设备更改为 iPhone 8 Plus,我会得到一个奇怪的尾随约束偏移量 - 右边缘 39pt,这正是 iPhone 8 加上点宽度和 iPhone 8.
当我在 Xcode 中的设备之间切换并发现尾随约束不正确时,我只是自己进行了调整(将尾随更改为 1,然后再更改为 0),问题就消失了设备。
最初我认为这是 Xcode 中的错误,但当我在设备上测试时问题仍然存在。
我尝试设置一个新的视图控制器并添加相同的元素但没有效果。
我附上屏幕截图以使我的问题更清楚。
之前:调整所需的约束
之后: 切换到不同大小的设备
将此添加为答案是因为评论太多了 - 尽管它实际上只是一种确认,而不是解决方案。
好的 - 查看了您的项目。
我会说这是一个 IB / Storyboard 错误,我在其他情况下也见过这种错误。如果您更改 View As...
设备,框架不会立即更新。
但是,如果您更改任何会导致布局更新的内容 - 例如临时更改视图的背景颜色或标签的字体大小 - 一切都应该卡入到位。
您还会注意到,如果您 select 一个元素并稍微移动它,Update Frames
按钮/菜单项就会启用...这也会正确更新框架。
注意: 当我 运行 应用程序时,无论布局在 Storyboard 中的外观如何,约束在 运行 时正确调整视图大小.
起初我接受了 DonMag 的回答(感谢您的宝贵时间),因为这似乎确实是一个 Xcode Interface Builder 错误。当我进一步调查我提到的场景时,自动布局约束不会在我需要时更新布局,因此没有给我正确的 view.bounds
。
我尝试在 viewDidLayoutSubviews()
中获取它,但也没有成功 - 它仍然为我提供了适合其他设备的尺寸。
诀窍是在使用视图边界之前调用 view.layoutIfNeeded()
。它所做的是立即更新视图的布局。因此,您可以访问所需视图的边界。