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

Mih*_*atu 6 objective-c ios autolayout swift

最终更新 - 修正

我修好了.看来尽管玩弄(这是我在斯威夫特的第一个项目,并使用自动版式)我已经改变了contentCompressionResistancePrioritycontentHuggingPriority对我的一些看法.取出该代码并将我的所有视图重置为IB中的默认值修复了我的问题.

初始帖子

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

...
internal error.  Cannot find an outgoing row head for incoming head UIImageView:0xd049d50.Width{id: 730}, which should never happen.'
...
Run Code Online (Sandbox Code Playgroud)

我一直在瞎逛,搜索网络,但我无法修复它.我发现虽然我的代码中有一行可以有所作为.在我说的视图控制器中,我有一堆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))
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?我真的需要满足这个宽高比,所以我不能真正删除它

更新2

再多说一点,我想办法让它发挥作用.但是我对此并不满意,因为它并没有让我明白发生了什么,这是一种黑客攻击

让我为您构建我的视图结构:

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

这些视图的放置方式如下:

  • Cover ImageView的宽度ContentView和宽高比为8:5,顶部没有空间
  • 每个Label都有一个10px的领先空间和10px的尾随空间
  • 每个ImageView都宽,ContentView并且纵横比为8:5
  • 所有视图都有10px的间隙,而最后一个视图的底部间距为10px ContentView

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

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

Mic*_*use 11

只需将此放在此处,以防任何人在动态的代码生成aspectRatio约束中遇到同样的问题.我在宽高比约束中切换了高度宽度关系的顺序(与问题中的那个相比):

aspectConstraint = NSLayoutConstraint(item: cardMedia, attribute: NSLayoutAttribute.Height , relatedBy: NSLayoutRelation.Equal, toItem: cardMedia, attribute: NSLayoutAttribute.Width, multiplier: aspect, constant: 0.0)
Run Code Online (Sandbox Code Playgroud)

乘数aspect的计算方法是:

let aspect = image.size.height / image.size.width
Run Code Online (Sandbox Code Playgroud)

而这似乎可以阻止崩溃的发生.希望这有助于某人.

  • 荒谬但它起作用.将IB中的纵横比约束从W:H = 16:9更改为H:W = 9:16 (3认同)

Mih*_*atu 2

好的。我已经修好了。看来我的一些约束设置不正确。喝了杯咖啡休息后,我弄清楚了哪些是哪些,现在事情不会再崩溃了。