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

时间:2014-06-13 23:56:04

标签: ios objective-c autolayout swift

最终更新 - 已修复

我已经修好了。看来,在玩游戏时(这是我在Swift中的第一个项目并使用AutoLayout),我已经更改了contentCompressionResistancePrioritycontentHuggingPriority的一些视图。取出该代码并将我的所有视图重置为IB中的默认值修复了我的问题。

首发

所以我在iOS上使用AutoLayout来定位我的动态视图。这一切都很好,很容易 直到我弹出一个视图控制器。该应用程序崩溃了一个非常有用的错误消息,如下所示:

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

我一直在寻找并搜索网络,但我无法修复它。我发现虽然我的代码中有一行可以有所作为。在我说的视图控制器中,我有一堆使用AutoLayout的UIImageView以及我从网上加载的图像。

如果不是将我收到的图片设置给他们,我会在 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

稍微弄清楚它,我已经找到了一种方法让它发挥作用。但是我对此并不满意,因为它并没有让我明白发生了什么,这是一种黑客攻击

让我为您构建视图结构:

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

这些观点的放置方式如下:

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

我对崩溃的修复是从ContentView上的堆栈中删除viewWillDisappear但是当弹出ViewController时屏幕会闪烁。

我已经检查了我创建代码1000次的约束,看起来是正确的。如果你想看到它让我知道,我会在这里发布

5 个答案:

答案 0 :(得分:11)

只需将此放在此处,以防任何人遇到与动态代码生成的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

这似乎阻止了崩溃的发生。希望这有助于某人。

答案 1 :(得分:3)

这听起来好像原始海报的问题已经解决,但我只是遇到了一个类似的问题,并采用了不同的解决方案。发布此处以防其他人遇到我的问题并找到此帖子。

我的应用程序在iPhone 5s(在模拟器中)在iOS 7中崩溃,但在iOS 8或其他设备上没有。当我的控制器被弹出时......以及在UIPageViewController中滚动控制器时,我得到了同样的错误("找不到传入头的传出行头...")。

在这两种情况下,问题都是因为我使用UIView.insertSubview:下面的子视图和UIView.bringSubviewToFront等API将全屏视图叠加在一起。解决方案/解决方法是更改​​我们的代码以动态添加/删除我们的视图,而不是堆叠它们并改组它们的顺序。

希望这可以帮助其他遇到同样问题的人。

答案 2 :(得分:2)

确定。我修好了。似乎我错误地设置了我的约束。喝完咖啡休息后,我想出了哪些,现在事情不会再崩溃了。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我自己遇到了一次非常类似的撞车事故。有趣的是,它也是UIImageView。在我的情况下,通过更改执行(或删除)调整内容压缩阻力的代码的顺序来缓解问题。 内容拥抱此图片视图的优先级。

在我的回答中查看更多详情:https://stackoverflow.com/a/27284071/796419

根据您的情况,您的长宽比似乎是'约束引发了类似的问题。