AutoLayout视图使应用程序在popViewController上崩溃

最终更新 – 修正

我已经解决了这个问题 看起来,虽然玩耍(这是我在Swift中使用AutoLayout的第一个项目),我改变了contentCompressionResistancePrioritycontentHuggingPriority为我的一些意见。 把这个代码拿出来,把我的所有视图重新设置为IB的默认值,解决了我的问题。

初始职位

所以我在iOS上使用AutoLayout来定位我的dynamic视图。 这一切都很好,很容易,直到我popup我的视图控制器之一。 该应用程序崩溃与一个非常有用的错误消息,是这样的:

 ... internal error. Cannot find an outgoing row head for incoming head UIImageView:0xd049d50.Width{id: 730}, which should never happen.' ... 

我一直在search网页,但我无法修复。 我发现,虽然我的代码中有一行可以有所作为。 在我所说的视图控制器中,我有一大堆正在使用AutoLayout的UIImageView ,以及我从networking上加载的图像。

如果不是将接收到的图像设置给它们,我就像我的情况一样,在Swift中设置一个空的( [[UIImage alloc] init]或者UIImage() ),它不会再崩溃了。

我甚至尝试从应用程序包中设置一个虚拟的图像,但也使它崩溃了。

我们欢迎所有的build议!

更新1

再看一遍代码,我还发现有一个与这些UIImageViews相关的约束,也使得崩溃消失时消失。 这是一个长宽比约束,看起来像这样

 imageView.addConstraint(NSLayoutConstraint(item: imageView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: imageView, attribute: NSLayoutAttribute.Height, multiplier: 8.0 / 5.0, constant: 0.0)) 

难道我做错了什么? 我真的需要这个宽高比来满足,所以我不能真正删除它

更新2

多花一点时间,我已经想通了一个办法,使其工作。 但是我对此并不满意,因为这并没有让我明白发生了什么事情,这是一种破解

让我来布置我的视图结构给你:

  • 视图
    • 滚动查看
      • 内容查看
        • 封面ImageView(来自IB)
        • 标题标签(来自IB)
        • …从代码中随机顺序的更多标签或ImageViews …

这些视图的放置方式如下所示:

  • Cover ImageViewContentView一样宽,并且宽高比为8:5,顶部没有空间
  • 每个Label都有一个10px的前导空间和一个10px的尾随空间
  • 每个ImageViewContentView一样宽,并且宽高比为8:5
  • 所有的视图都有一个10px的间距,而最后一个视图的内容视图有10px的底部间距

我对崩溃的修复是从viewWillDisappear的堆栈中移除ContentView ,但是当ViewControllerpopup时,屏幕就会闪烁。

我已经检查了我的约束创build代码1000次,这似乎是正确的。 如果你想看到它,让我知道,我会张贴在这里

只是把这个放在这里,以防任何人有一个dynamic的,代码生成的aspectRatio约束相同的问题。 我在纵横比约束中切换了“ 高度”和“ 宽度”关系的顺序(与问题中的比较):

 aspectConstraint = NSLayoutConstraint(item: cardMedia, attribute: NSLayoutAttribute.Height , relatedBy: NSLayoutRelation.Equal, toItem: cardMedia, attribute: NSLayoutAttribute.Width, multiplier: aspect, constant: 0.0) 

乘数aspect的计算方法如下:

 let aspect = image.size.height / image.size.width 

而这似乎阻止了事故的发生。 希望这有助于某人。

这听起来像原来的海报的问题已经解决,但我碰到了一个不同的解决scheme类似的问题。 张贴在这里,以防其他人遇到我的问题,并find这个职位。

我的应用程序在iPhone 5s(在模拟器中)iOS 7中崩溃,但不在iOS 8或其他设备上。 我得到这个相同的错误(“无法find一个传出行头…”),当我的控制器被popup…还有当控制器正在从UIPageViewController滚动离开。

在这两种情况下,这个问题都是由于我使用UIView.insertSubview之类的全屏幕视图堆叠在一起而引发的:belowSubview:和UIView.bringSubviewToFront:。 该解决scheme/解决方法是更改​​我们的代码dynamic添加/删除我们的意见,而不是堆叠和洗牌顺序。

希望这可以帮助任何碰到同样问题的人。

好。 我修好了 似乎我有我的约束索姆设置不正确。 在rest一会儿之后,我想出了哪些东西,现在东西不会再崩溃了。

在我的情况下,这是因为我试图布局(自动布局)具有height == CGFLOAT_MAX.的视图的子视图height == CGFLOAT_MAX. 相同的代码在iOS7上运行良好,但在iOS6上崩溃。

我自己碰到了一个非常类似的崩溃。 有趣的是,它也是一个UIImageView 。 就我而言,通过改变执行(或删除)调整内容压缩抵抗内容拥抱优先级的代码的顺序来缓解这个问题。

在我的答案中查看更多详细信息: https : //stackoverflow.com/a/27284071/796419

根据你的情况,你的“长宽比”约束似乎引发了类似的问题。