【问题标题】:Strange autolayout behaviour on collection views集合视图上奇怪的自动布局行为
【发布时间】:2015-11-10 02:07:49
【问题描述】:

我的自动布局有问题,控制台报告我在单元格中的图像视图有问题:

RefreshCatalogue[31754:16177989] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7fa98103b740 V:[UIImageView:0x7fa9810375d0]-(0)-|   (Names: '|':UIView:0x7fa9810371d0 )>",
    "<NSLayoutConstraint:0x7fa98103b7e0 V:|-(0)-[UIImageView:0x7fa9810375d0]   (Names: '|':UIView:0x7fa9810371d0 )>",
    "<NSLayoutConstraint:0x7fa98103b8d0 UIImageView:0x7fa9810375d0.centerY == UIImageView:0x7fa981037490.centerY>",
    "<NSLayoutConstraint:0x7fa98103ba60 UIImageView:0x7fa981037490.top == UIView:0x7fa9810371d0.topMargin + 71>",
    "<NSAutoresizingMaskLayoutConstraint:0x7fa980d44a10 h=--& v=--& V:[UIView:0x7fa9810371d0(50)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7fa98103b8d0 UIImageView:0x7fa9810375d0.centerY == UIImageView:0x7fa981037490.centerY>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

问题是,如果我这样做:

[self.collectionView reloadItemsAtIndexPaths:@[indexPath]];

即使图像视图似乎有正确的框架,也没有任何显示,图像属性已设置。 如果我重新加载整个集合视图:

[self.collectionView reloadData];

错误仍然存​​在,但图像显示。代码在这里开放,有兴趣的人可以看看: https://github.com/Ridiculous-Innovations/RefreshCatalogue

此外,故事板中的所有约束似乎都是蓝色的。知道可能导致问题的原因吗?

编辑:不用说,包括图像视图在内的所有元素都在正确的位置(我确实调试了帧并设置了随机颜色)但图像直到刷新才显示......有时单元格不会完全显示

【问题讨论】:

  • 尝试删除约束并添加它们。尝试使用优先级。
  • 不要把所有的约束都加进去,这样在改变设备布局的时候就不能全部满足
  • 错误消息说:“如果您看到 NSAutoresizingMaskLayoutConstraints...” 那么,您正在看到它。这是一个大问题。您可能忘记将此视图的 translatesAutoresizingMaskIntoContraints 设置为 NO。 (但我没有检查你的代码;仅仅 50 个赏金点,我不会涉足你的整个代码。把你的整个代码像意大利面条一样扔在墙上,并希望有人为你修复它有点粗鲁。 ..)
  • 感谢有关 translatesAutoresizingMaskIntoContraints 的提示,将检查...不幸的是,不得不说您的其余评论是不必要的,没有建设性的,甚至有点自大...我以前帮助过人们并将代码引用作为任何人都可以在需要时使用的附加信息,并且所有这些都不需要赏金。
  • 检查了您的项目 - 由于缺少 LUIFramework,它无法构建。

标签: ios objective-c xcode autolayout uicollectionview


【解决方案1】:

警告信息提供了问题所在的线索。

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7fa98103b8d0 UIImageView:0x7fa9810375d0.centerY == UIImageView:0x7fa981037490.centerY>

所以要分析你有两个基于视图的对象。一个设置为从上到下将其自身居中到另一个视图(0x7fa9810375d0 到 0x7fa981037490 - 这些是视图 ID)

而且view id 0x7fa981037490还有另外一个约束,

<NSLayoutConstraint:0x7fa98103ba60 UIImageView:0x7fa981037490.top == UIView:0x7fa9810371d0.topMargin + 71>

看起来 0x7fa981037490 的顶部与视图 0x7fa9810371d0 的顶部加上 71 个点对齐。

我还没有下载你的项目,但我敢打赌这就是问题所在。最好的猜测是 center.y 约束不能得到满足,因为 align top 将 ImageView 移动到破坏它的地方。尝试在脑海中直观地查看您在约束中设置的内容。您已与 ImageViews 对齐并将其中一个与另一个视图的边缘对齐。那怎么破? (这是你应该问自己的)

尝试一次移除一个约束,然后构建并运行。如果警告出现,那就是需要修复的那个。是的,视图可能看起来很奇怪,您可以使用 Command + Z 来一一撤消对约束的删除。

试一试。告诉我

【讨论】:

    【解决方案2】:

    在第二个单元格中,一些约束被禁用。这意味着任何高度任何宽度的约束都将被删除。因此,当您在 iphone 中运行应用程序时,该约束与您当前的约束冲突。

    所以删除突出显示的禁用约束。

    【讨论】:

      【解决方案3】:

      观看次数:

      UIView:0x7fa9810371d0,我们将其命名为container
      UIImageView:0x7fa9810375d0,我们将其命名为image1
      UIImageView:0x7fa981037490,我们将其命名为image2

      不要让我们检查约束

      容器height50,由自动调整大小指定。您的收藏视图可能未指定高度。这很可能是在将单元格调整为集合视图布局指定的大小之前创建单元格时的大小。

      image2 是容器 topMargin 下的71 点,因此它至少是容器底部边缘下的21 点。

      image1bottom 与容器底部对齐,因此位于容器底部边缘上方。

      现在你的最后一个约束集中在image1image2 垂直所以显然有碰撞。

      很难知道您要做什么,但我想您应该仅相对于容器定位 image1 并且 image2 的唯一垂直约束应该是垂直居中的约束。

      在 Interface Builder 中也看到错误,将单元格高度更改为 50,您将看到一切都被破坏了。只有一些不必要的限制会导致调整大小时发生冲突。

      还有一些未针对当前尺寸等级安装的约束。您可能在不同大小类别的模拟器上运行应用程序并安装了它们。这意味着甚至还有一些额外的碰撞。

      【讨论】:

        【解决方案4】:

        您遇到了 UIImageView:0x7fa981037490.top == UIView:0x7fa9810371d0.topMargin + 71 和高度为 0 的父框架(因此 imageview 高度必须为负数,但这是不允许的)的问题,就像在调用 dequeueReusableCell 方法之后一样。 这种情况的可能解决方法是将嵌套视图中最底部约束的优先级从 1000 更改为 999(垂直空间 - catalogueHeaderCell - 图像视图和垂直空间 - catalogueCell - 信息视图)。

        【讨论】:

          【解决方案5】:

          试试这个,它可以帮助我消除控制台中的那些约束中断。

          yourCustomCell.contentView.frame = yourCustomCell.bounds;  
          

          【讨论】:

            【解决方案6】:

            检查你的 imageView centerY 约束

            删除此约束... 这个问题是由于约束歧义而发生的。在添加自动布局时,您必须对 imageView 应用适当的自动布局约束。

            如果有歧义,删除 centerY 约束后,xcode 将再次显示相同的错误,您必须再次删除歧义约束。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-03-16
              • 2014-08-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多