【发布时间】:2014-08-04 14:24:50
【问题描述】:
最终更新 - 已修复
我已经解决了这个问题。似乎在玩耍时(这是我在 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.'
...
我一直在四处寻找并搜索网络,但我无法修复它。虽然我发现我的代码中有一行可以产生影响。在我所说的视图控制器中,我有一堆 UIImageViews 正在使用 AutoLayout 以及我从网络加载的图像。
如果我没有将收到的图像设置为它们,而是在 Swift 中设置了一个空图像([[UIImage alloc] init] 或 UIImage()),就像我的情况一样)它不会再崩溃了。
我什至尝试从应用程序包中设置一个虚拟图像,但这也会导致它崩溃。
任何建议将不胜感激!
更新 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
再搞砸一点,我想出了一个让它工作的方法。但我对它不满意,因为它没有让我明白发生了什么,而且它有点像 hack
让我给你布置我的视图结构:
- 查看
- 滚动视图
- 内容视图
- 封面 ImageView(来自 IB)
- 标题标签(来自 IB)
- ...更多标签或图像视图以随机顺序从代码中...
- 内容视图
- 滚动视图
这些视图的放置方式是这样的:
-
Cover ImageView与ContentView一样宽,纵横比为 8:5,顶部没有空间 - 每个
Label都有一个 10 像素的前导空格和一个 10 像素的尾随空格 - 每个
ImageView与ContentView一样宽,纵横比为8:5 - 所有视图之间都有 10px 的间隙,最后一个与
ContentView的底部间距为 10px
我对崩溃的解决方法是从 viewWillDisappear 的堆栈中删除 ContentView,但这会使 ViewController 弹出时屏幕闪烁。
我已经检查了我的约束创建代码 1000 次,这似乎是正确的。如果你想看,请告诉我,我会在这里发布
【问题讨论】:
-
嗯...我之前确实读过它,但似乎没有任何帮助。它确实让我再次浏览了我的代码并发现了另一件事。我会用它更新我的问题
-
好像你的 UIImageView.image 正在幕后发布。
-
另一种方法是像使用 IBOutlet / Action 一样将约束拖到您的 VC - 这样您可以通过代码根据需要更改方面。从错误中,您可能尝试使用一个约束设置宽度,然后使用另一个约束设置纵横比?结果是两个约束冲突?
-
这似乎确实是某个地方的约束问题,但我无法真正弄清楚发生了什么。我无法在 IB 中进行约束,因为这些视图是基于我从服务器获得的数据以编程方式创建的。我设法让它有时崩溃。我仍在努力,如果我修复它,我会发布我的解决方案
标签: ios objective-c autolayout swift