最终更新 - 已解决
我已经解决了这个问题。看起来在玩弄代码时(这是我第一次使用Swift和AutoLayout),我改变了一些视图的contentCompressionResistancePriority
和contentHuggingPriority
。将该代码删除并将所有视图重置为IB中的默认值即可解决我的问题。
初始帖子
因此,我正在iOS上使用AutoLayout来定位我的动态视图。一切都很顺利,直到我退出其中一个视图控制器。应用程序崩溃,并显示一个非常不友好的错误消息,大致如下:
...
internal error. Cannot find an outgoing row head for incoming head UIImageView:0xd049d50.Width{id: 730}, which should never happen.'
...
我一直在搜寻和搜索网络,但是无法解决问题。然而,我发现我的代码中有一行可以做出改变。在我的视图控制器中,我有一堆UIImageView
使用了自动布局,并且这些图片从网上加载。
如果我将接收到的图片设置为空的([[UIImage alloc] init]
或 UIImage()
)在Swift中,就不会再崩溃了。
我甚至尝试从应用程序包中设置虚拟图片,但那也导致了崩溃。
非常感谢您提供任何建议!
更新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
我再试验一下,发现了一种方法使它工作。但我不满意它,因为它没有让我理解发生了什么,而且有点像黑客行为。
让我向您展示我的视图结构:
- 视图
- 滚动视图
- 内容视图
- 封面图片视图(来自IB)
- 标题标签(来自IB)
- ...更多的标签或图片视图按代码中的随机顺序...
- 内容视图
- 滚动视图
这些视图的放置方式如下:
- 封面图片视图与
ContentView
同宽,纵横比为8:5,顶部没有空间 - 每个标签有10px的前导空间和10px的后续空间
- 每个图片视图与
ContentView
同宽,纵横比为8:5 - 所有视图之间都有10px的间隙,最后一个视图与
ContentView
之间有10px的底部间距
我的解决方法是在viewWillDisappear
时从堆栈中删除ContentView
,但这会使ViewController弹出时屏幕闪烁。
我检查了1000次我的约束创建代码,看起来没问题。如果您想看到它,请告诉我,我会在这里发布它。