【问题标题】:AutoLayout views make app crash on popViewControllerAutoLayout 视图使应用程序在 popViewController 上崩溃
【发布时间】:2014-08-04 14:24:50
【问题描述】:

最终更新 - 已修复

我已经解决了这个问题。似乎在玩耍时(这是我在 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.'
...

我一直在四处寻找并搜索网络,但我无法修复它。虽然我发现我的代码中有一行可以产生影响。在我所说的视图控制器中,我有一堆 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 ImageViewContentView 一样宽,纵横比为 8:5,顶部没有空间
  • 每个Label 都有一个 10 像素的前导空格和一个 10 像素的尾随空格
  • 每个ImageViewContentView 一样宽,纵横比为8:5
  • 所有视图之间都有 10px 的间隙,最后一个与 ContentView 的底部间距为 10px

我对崩溃的解决方法是从 viewWillDisappear 的堆栈中删除 ContentView,但这会使 ViewController 弹出时屏幕闪烁。

我已经检查了我的约束创建代码 1000 次,这似乎是正确的。如果你想看,请告诉我,我会在这里发布

【问题讨论】:

  • 嗯...我之前确实读过它,但似乎没有任何帮助。它确实让我再次浏览了我的代码并发现了另一件事。我会用它更新我的问题
  • 好像你的 UIImageView.image 正在幕后发布。
  • 另一种方法是像使用 IBOutlet / Action 一样将约束拖到您的 VC - 这样您可以通过代码根据需要更改方面。从错误中,您可能尝试使用一个约束设置宽度,然后使用另一个约束设置纵横比?结果是两个约束冲突?
  • 这似乎确实是某个地方的约束问题,但我无法真正弄清楚发生了什么。我无法在 IB 中进行约束,因为这些视图是基于我从服务器获得的数据以编程方式创建的。我设法让它有时崩溃。我仍在努力,如果我修复它,我会发布我的解决方案

标签: ios objective-c autolayout swift


【解决方案1】:

好的。我已经修好了。似乎我的一些约束设置不正确。喝完咖啡后,我弄清楚了哪些问题,现在事情不会再崩溃了。

【讨论】:

  • 你让我朝着正确的方向前进。我删除了一些在视图上被忽略的纵横比约束,这个问题就消失了。我不知道为什么这会导致崩溃,而且这种情况并非 100% 发生。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我自己也遇到过类似的崩溃。有趣的是,它还带有UIImageView。在我的例子中,通过更改(或删除)调整此图像视图的 内容压缩阻力内容拥抱 优先级的代码的执行顺序(或删除),问题得到了缓解。

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

    根据您的情况,您的“纵横比”限制似乎引发了类似问题。

    【讨论】:

      【解决方案4】:

      听起来原始发帖人的问题已经解决了,但我只是遇到了一个类似的问题,但有不同的解决方案。在这里发布它以防其他人遇到我的问题并找到此帖子。

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

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

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

      【讨论】:

        【解决方案5】:

        把它放在这里,以防有人遇到与动态代码生成的aspectRatio 约束相同的问题。我在纵横比约束中切换了 HeightWidth 关系的顺序(与问题中的比较):

        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
        

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

        【讨论】:

        • 可笑但它奏效了.. 将 IB 中的纵横比约束从 W:H = 16:9 更改为 H:W = 9:16
        • 酷。我这样做是因为在我的情况下项目宽度是固定的,只是高度在变化。我遵循这个等式item1.attribute1 = multiplier × item2.attribute2 + constant
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-19
        • 1970-01-01
        • 2014-01-05
        • 2014-09-23
        • 1970-01-01
        • 2012-06-27
        • 2015-09-29
        相关资源
        最近更新 更多