使用 AutoLayout 时子视图 Rect 不等于视图 Rect

Posted

技术标签:

【中文标题】使用 AutoLayout 时子视图 Rect 不等于视图 Rect【英文标题】:subview Rect doesn't equal view Rect when using AutoLayout 【发布时间】:2016-07-17 00:28:08 【问题描述】:

我正在使用自动布局和大小类。我在主视图下有一个测试视图,如下所示:

包含所有 6 个约束:

预期的结果应该是测试视图具有完全相同的 Rect 值。但事实并非如此。我究竟做错了什么?我怎样才能实现这种行为?

viewDidLoad 日志:

iPhone 5:

主视图 - NSRect:0, 0, 320, 568

测试视图:NSRect:0, 0, 600, 600

iPhone 6:

主视图 - NSRect:0, 0, 375, 667

测试视图:NSRect:0, 0, 600, 600

【问题讨论】:

【参考方案1】:

正如这个答案中所指定的,always 600x600,您需要在 viewDidLayoutSubviews 中打印您的日志。视图是否正确显示?

此外,如果您将边缘设置为与父对象相同,则不需要宽度和高度约束,但这是一件小事。

希望对您有所帮助,如果您仍有问题,请发表评论,祝您好运。

【讨论】:

天啊....谢谢。这完全有道理。这意味着我应该在viewDidLayoutSubviews 函数中配置我的视图。 @docchang:我更喜欢在viewWillLayoutSubviews 中进行视图配置。在此方法中,[[UIApplication sharedApplication] statusBarOrientation] 正确反映了任何飞行中方向更改转换的最终状态,这会影响布局。因此,如果由于方向更改而需要交换视图,请在此处进行。

以上是关于使用 AutoLayout 时子视图 Rect 不等于视图 Rect的主要内容,如果未能解决你的问题,请参考以下文章

CALayer 子层在设备旋转期间不优雅

创建UICollectionViewCell时子视图帧不正确

创建 UICollectionViewCell 时子视图框架不正确

隐藏标题栏时子视图被禁用

如何使用 AutoLayout 根据父高度调整子视图高度而不添加/删除约束

仅更新视图的一部分而不使用 invalidate(Rect)