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

时间:2014-09-21 01:15:19

标签: ios objective-c autolayout ios8

我有一个使用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似乎决心缩小我的形象。

非常感谢!

2 个答案:

答案 0 :(得分:10)

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

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

Demo project is here.

enter image description here

答案 1 :(得分:-1)

尝试使用UIViewContentModeScaleAspectFill和setClipsToBounds:NO