iOS 8 上的自动布局问题(代码在 iOS 7 上完美运行)

Posted

技术标签:

【中文标题】iOS 8 上的自动布局问题(代码在 iOS 7 上完美运行)【英文标题】:Issue with Auto Layout on iOS 8 (code works perfectly on iOS 7) 【发布时间】:2014-09-21 01:15:19 【问题描述】:

我有一个使用auto-layout 构建的应用程序,当我在我的 ios 7 设备上运行它时,一切仍然按预期运行,但是当我在 iOS 8 设备上运行它时,我的一些限制变得有点古怪。

我实际上在另一个应用程序中遇到了类似的问题,但这不是一个大问题。现在,我开始怀疑这是否是 iOS 8 SDK 中的一个错误,或者是否有一种我不知道的在 iOS8 中处理自动布局的新方法。

这是我的设置: 我有一个UIView,其中嵌入了一个UIImageView。视图和图像视图都有约束将它们的底部、前缘和后缘固定到它们的超级视图,常量 = 0。

UIView 的顶部边缘也固定在其父视图上,并且我有一个连接到约束的 IBOutlet,以便以编程方式对其进行调整。 UIImageView 有第四个约束,将其高度固定为设备的高度(在我的例子中是 568)。

这是我在 iOS 7 中期望/实现的行为: 我正在尝试缩小容器视图的高度并导致图像视图的顶部被截断而不会改变纵横比(有点像您将图像的顶部裁剪掉了)......这就是为什么我已经固定了图像视图的高度和底部边缘。

iOS8 中实际发生的情况: 容器视图按预期缩小(它保持固定在侧面和底部,高度缩小)。 UIImageView 的行为就好像它有一个带有 cosntant == 0 的顶部空间约束。不是切断图像的顶部,而是整个图像缩小了。由于我的图像处于AspectFit 模式,因此两侧也会夹入以保持纵横比相同(但 imageView 本身仍应固定在前缘、后缘和底部边缘)。

我是如何做到的: 我有一个通知从我的代码的另一部分触发,以调整连接到 IBOutlet 的顶部空间约束。它调用的方法真的很简单:

- (void) setTopSpaceForContainerView:(NSNotification*) notif
    containerView_TopSpace.constant = [[notif.userInfo objectForKey:kTopSpace] intValue];
    [self.view setNeedsUpdateConstraints];
    [self.view setNeedsLayout];

其他人有类似经历吗?我正在尝试寻找解决方法,但 iOS 8 似乎决心缩小我的图像。

非常感谢!

【问题讨论】:

我遇到了可能与此相关的问题:***.com/questions/25987244/… 我的应用在 iOS7 上运行良好,但在 iOS8 上出现问题。我还在研究这个,但还没有天亮。 与滚动视图相同的船:***.com/questions/26047595/…尚无答案 【参考方案1】:

这绝对是 iOS 8 的错误。我可以通过将setNeedsLayout 发送到容器视图(图像视图的超级视图)来解决它。

我看到您将setNeedsLayout 发送到self.view。如果该代码在您的视图控制器中,那么我猜self.view 不是容器视图。尝试直接将setNeedsLayout 发送到容器视图。

Demo project is here.

【讨论】:

有效! +1 更多,因为这也向后兼容 iOS 7。这让我想知道,在 iOS7 中,在根视图上调用 setNeedsUpdateConstraintssetNeedsLayout 会自动向下传递到所有子视图。现在我们需要专门在约束发生变化的视图上调用 setNeedsLayout ......这似乎可以减少不必要的布局计算并加快速度。我应该一直这样做吗? 我不认为它会像你想象的那样流淌下来。我认为在 iOS 7 中,更改约束常量会将受约束的视图标记为需要布局(或以其他方式触发约束求解器),而在 iOS 8 中则不需要。 是的,这很有意义。听起来我们中的许多人是时候修复我们所有的 setNeedsLayout 调用以指向具有变化约束的视图了。 我真的很高兴能在我的问题上尝试这个,看看事情是否解决了:***.com/questions/25987244/… 如果是这样,我会回来标记这只小狗! 雷达已被 Apple 接收并修复。这是一个 iOS 8 错误。见twitter.com/mairwatching/status/517747734564990976这里有更多细节:twitter.com/mairwatching/status/517748417452208129【参考方案2】:

尝试使用 UIViewContentModeScaleAspectFill 和 setClipsToBounds:NO

【讨论】:

仍然有同样的问题:/

以上是关于iOS 8 上的自动布局问题(代码在 iOS 7 上完美运行)的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 和 8 中 UITableViewCells 的自动布局指标不同

iOS 自动布局 ios 7 与 ios 8

iOS 7 自动布局与 iOS 8 自适应布局,有区别吗?

iOS 7 与 iOS 8 自动布局问题

高度的自动布局在 iOS 8 中工作但在 iOS 7 中不工作

iOS 8.1 中核心数据绑定的自动布局问题,但 iOS 7 中没有