AutoLayout视图使应用程序在popViewController上崩溃
最终更新 – 修正
我已经解决了这个问题 看起来,虽然玩耍(这是我在Swift中使用AutoLayout的第一个项目),我改变了contentCompressionResistancePriority
和contentHuggingPriority
为我的一些意见。 把这个代码拿出来,把我的所有视图重新设置为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 ImageView
与ContentView
一样宽,并且宽高比为8:5,顶部没有空间 - 每个
Label
都有一个10px的前导空间和一个10px的尾随空间 - 每个
ImageView
与ContentView
一样宽,并且宽高比为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
根据你的情况,你的“长宽比”约束似乎引发了类似的问题。