iOS 8上自动布局出现问题(在iOS 7上代码可以完美运行)

19

我有一个使用了自动布局的应用程序,当我在iOS 7设备上运行它时,一切都按预期工作,但是当我在iOS 8设备上运行它时,我的某些约束条件会出现一些问题。

我曾经在另一个应用程序中遇到过类似的问题,但那不是什么大问题。现在,我开始怀疑这是否是iOS 8 SDK中的一个bug,或者是否有一种我不知道的新的处理自动布局的方式。

这是我的设置: 我有一个UIView,其中嵌入了一个UIImageView。视图和图像视图都具有将它们的底部、前导和尾随边固定到其父视图的约束条件,常量为0。

UIView还将其顶部边固定到其父视图,并且我已经连接了IBOutlet以便在编程时调整它。 UIImageView具有第四个约束条件,将其高度固定为设备的高度(在我的情况下为568)。

这是我在iOS 7中期望/实现的行为: 我正在尝试缩小容器视图的高度,并使图像视图的顶部被裁剪而不改变宽高比(类似于从图像的顶部裁剪)...这就是为什么我将图像视图的高度和底部边缘固定的原因。

在iOS8中实际发生的情况: 容器视图按预期缩小(它保持固定在两侧和底部,高度缩小)。 UIImageView 的行为好像有一个上空间约束,constant == 0。它不是像我希望的那样裁剪掉图像的顶部,而是整个图像都缩小了。由于我将图像放置在AspectFit模式下,侧面也会收缩以保持宽高比相同(但ImageView本身仍然与前导、尾随和底部边缘固定)。

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

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

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

非常感谢!


2
我遇到了一个可能相关的问题:https://dev59.com/2F8e5IYBdhLWcg3wNIFp 我的应用在iOS7上运行得很好,但在iOS8上出现了问题。我还在继续研究,但目前还没有任何进展。 - Gallymon
1
我也遇到了scrollview的问题:https://dev59.com/f4Pba4cB1Zd3GeqPwLzl 目前还没有答案。 - Pilouk
2个回答

10

这绝对是iOS 8的一个bug。我通过向容器视图(UIImageView的父视图)发送setNeedsLayout来解决它。

我看到你正在向self.view发送setNeedsLayout。如果这段代码在您的视图控制器中,则我猜self.view不是容器视图。尝试直接向容器视图发送setNeedsLayout

演示项目在此处。

enter image description here


是的,这很有道理。听起来现在是我们许多人去修复所有setNeedsLayout调用指向具有变化约束的视图的时候了。 - BFar
我非常兴奋地想尝试在我的问题上使用这个,并查看事情是否会得到解决:https://dev59.com/2F8e5IYBdhLWcg3wNIFp。如果真的有效,我会回来给这个点赞的! - Gallymon
我一直在思考这个问题。在iOS6/7中,我有两个嵌套的VC级别,从未调用过setNeedsUpdateConstraints或setNeedsLayout。直到iOS8之前,布局似乎总是自己完成的。我所做的唯一一件事就是等待viewDidLayoutSubviews,以便我可以做一些在所有计算结束之前无法完成的事情。那么,区别在于现在我们必须明确要求更新吗?对于所有这些仍然感到有些困惑。 - Gallymon
我认为iOS 8在更改约束常量时不运行自动布局是一个错误。 - rob mayoff
4
雷达已被苹果公司发现并修复。这是 iOS 8 的一个漏洞。请查看 https://twitter.com/mairwatching/status/517747734564990976 获取更多详情:https://twitter.com/mairwatching/status/517748417452208129 - smileyborg
显示剩余7条评论

-1

尝试使用UIViewContentModeScaleAspectFill并设置setClipsToBounds:NO


仍然存在相同的问题 :/ - BFar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接