iphone 6 plus 上具有 600x600 pt 框架的 UIViews 以及大小类

Posted

技术标签:

【中文标题】iphone 6 plus 上具有 600x600 pt 框架的 UIViews 以及大小类【英文标题】:UIViews with a frame of 600x600 pt on iphone 6 plus with size classes 【发布时间】:2014-12-04 15:46:31 【问题描述】:

我正在开发一个可在所有设备(iPad、iPhone)上使用的应用程序。我为 iPad 和 iPhone 平台使用不同的 xib 文件(只是因为原始应用程序仅适用于 iPad,并且效果很好(没有任何自动布局))。

我的 iPhone xib 文件使用自动布局和大小类。我有启动屏幕,我的启动图像设置好了。当应用程序启动时,viewDidLoad 中的视图框架为 600x600,但没关系,在 viewWillAppear 之前我不会对其进行任何操作。

此时 xib 文件的框架是正确的(对于 iphone5 和 iphone 6 和 iPhone 6+)。但是我在这个 xib 中几乎没有其他视图与主视图平行(不是任何其他视图的子视图)。所有这些其他视图都有一个 600x600 的框架。

我可以显式设置框架,但是我必须手动调整每个子视图的大小...

如果我关闭尺寸类并仅使用自动布局,则框架始终为 iphone 5s 尺寸。

附:我刚刚添加了所有可能的启动图像(正确尺寸)删除了尺寸类和尺寸如下: 主视图 - 框架 = (0 0; 667 375)

在xib中查看旁边的(不是子视图,但也必须是全屏视图)-frame = (0 0; 568 320)

所有视图尺寸都是内部和横向的。

编辑 1 所以我的问题是: xib 中的其他视图如何在正确的框架中初始化?不是 600x600。

如果我使用“在视图层次结构中调试”,我可以看到除主“视图”之外的所有作为根视图(而不是任何子视图)的视图的大小都不正确。即使正确报告了屏幕边界,视图仍然是 600x600 大小。

编辑 2 这个问题提出了类似的问题: ios 8 top layout guide auto layout problems 但是没有给出可以普遍解决问题的答案。

【问题讨论】:

***.com/a/27208285/1702413 您的链接指向类似的问题,但问题是,即使在调用“viewDidLayoutSubviews”之后 - 帧仍保持 600x600。 我更新了问题以更清楚地问:为什么我的其他视图没有以正确的大小初始化? 我发现只有 xib 中的主视图大小合适。我的 xib 中的所有其他视图都获得默认/上次使用的框架。好像“推断”仅适用于 xib 中的第一个视图... 【参考方案1】:

如果我将所有其他视图作为子视图添加到我的主视图中,框架的大小会正确(感谢自动布局),但这对我来说不是一个选项,因为我不能在启动时将它们全部作为子视图。

这就是我让它为我工作的方式:

一旦我添加了帧错误的子视图,我就会向它添加自动布局约束,如下所示:

[self.view addSubview:_subviewFromSameXib];  //naming just for example

_subviewFromSameXib.translatesAutoresizingMaskIntoConstraints = NO;


[self.view addConstraint:[NSLayoutConstraint constraintWithItem:_subviewFromSameXib
                                                          attribute:NSLayoutAttributeTop
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:self.view
                                                          attribute:NSLayoutAttributeTop
                                                         multiplier:1.0
                                                           constant:0.0]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:_subviewFromSameXib
                                                          attribute:NSLayoutAttributeLeading
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:self.view
                                                          attribute:NSLayoutAttributeLeading
                                                         multiplier:1.0
                                                           constant:0.0]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:_subviewFromSameXib
                                                          attribute:NSLayoutAttributeBottom
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:self.view
                                                          attribute:NSLayoutAttributeBottom
                                                         multiplier:1.0
                                                           constant:0.0]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:_subviewFromSameXib
                                                          attribute:NSLayoutAttributeTrailing
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:self.view
                                                          attribute:NSLayoutAttributeTrailing
                                                         multiplier:1.0
                                                           constant:0.0]];

这将执行以下操作: 添加我的子视图后,它会添加新的约束,告诉该子视图它必须根据其父视图调整大小。

这解决了我的问题,但没有解决主要问题:xib 中的多个视图不会根据屏幕边界调整大小。只有第一个可以。

顺便说一句,我使用的是 xibs 而不是故事板。我应该添加该游乐场在所有设备上正确显示所有视图。只有在运行时他们才会搞砸。

【讨论】:

我试图解决几乎相同的问题,除了tableView.backgroundView。我试过这个,但仍然无济于事。我什至不知道我的视图到底在做什么,框架默认为 600x600,但我只剩下一个透明/空白视图。 您可以尝试使用“调试视图层次结构”按钮,该按钮位于调试器输出上方的工具栏中。它位于此相机图标的左侧(此工具栏与断点禁用按钮相同)。或者你可以只用像绿色这样的锐利颜色为你的视图着色......我从来没有真正找到这个问题的答案,但我确实通过手动自动布局设置克服了它。您可以尝试设置 backgroundView 的自动布局约束以包含其超级视图(tableView)。

以上是关于iphone 6 plus 上具有 600x600 pt 框架的 UIViews 以及大小类的主要内容,如果未能解决你的问题,请参考以下文章

ARKit 演示在 iPhone 6/iPhone 6 Plus 上崩溃

支持iPhone 6和iPhone 6+,具有不同的启动/启动屏幕图像,适用于iPad纵向和横向方向

iPhone 6 / 6 Plus 模拟器是不是支持更改显示缩放模式?

iphone 6 plus 上自动布局的意外结果

iPhone 6 plus 上堆栈视图的奇怪行为

更新为 iPhone 5 制作的 XIB 以与 iPhone 6 和 iPhone 6 Plus 一起使用