添加披露指示符时,ios8单元格约束中断

添加披露指示符时,ios8单元格约束中断,ios,objective-c,uitableview,ios8,Ios,Objective C,Uitableview,Ios8,我在IOS8上的自动布局有问题,我可以重新创建的最简单的例子是一个简单的tableView。我设置了一个静态单元格,然后简单地添加了一个标签 我的目标是让标签在很大程度上填满空间,所以我对标签有三个限制 在superview中垂直居中(我认为这很好) 将标签尾部边距设置为30(相对于superview) 将标签前导边距设置为30(相对于superview) 这一切都非常好,工作完美,没有重大问题或警告(它确实警告零高度,但我认为这不是一个太大的问题) 现在。。。如果我加上披露指标,一切都会分崩离

我在IOS8上的自动布局有问题,我可以重新创建的最简单的例子是一个简单的tableView。我设置了一个静态单元格,然后简单地添加了一个标签

我的目标是让标签在很大程度上填满空间,所以我对标签有三个限制

  • 在superview中垂直居中(我认为这很好)
  • 将标签尾部边距设置为30(相对于superview)
  • 将标签前导边距设置为30(相对于superview)
  • 这一切都非常好,工作完美,没有重大问题或警告(它确实警告零高度,但我认为这不是一个太大的问题)

    现在。。。如果我加上披露指标,一切都会分崩离析。看起来还可以,但我得到以下信息:

    2014-10-30 15:51:46.358 ContraintIssue[25572:1586028] 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:0x7fd3f3d23390 UITableViewCellContentView:0x7fd3f3d226f0.trailingMargin == UILabel:0x7fd3f3d227e0'Label'.trailing + 30>",
        "<NSLayoutConstraint:0x7fd3f3d235f0 UILabel:0x7fd3f3d227e0'Label'.leading == UITableViewCellContentView:0x7fd3f3d226f0.leadingMargin + 30>",
        "<NSLayoutConstraint:0x7fd3f53b73b0 'fittingSizeHTarget' H:[UITableViewCellContentView:0x7fd3f3d226f0(38)]>"
    )
    
    Will attempt to recover by breaking constraint 
    <NSLayoutConstraint:0x7fd3f3d23390 UITableViewCellContentView:0x7fd3f3d226f0.trailingMargin == UILabel:0x7fd3f3d227e0'Label'.trailing + 30>
    
    2014-10-30 15:51:46.358矛盾[25572:1586028]无法同时满足约束。
    可能下面列表中至少有一个约束是您不想要的。
    试试这个:
    (1) 看看每一个约束,试着找出你不期望的;
    (2) 找到添加了不需要的约束的代码,然后修复它。
    (注意:如果您看到您不了解的NSAutoresizingMaskLayoutConstraints,
    请参阅UIView属性translatesAutoresizingMaskIntoConstraints的文档
    (
    "",
    "",
    ""
    )
    将尝试通过打破约束进行恢复
    
    我不明白为什么添加一个指标会导致这样的问题,这和数字的规模无关,我已经做了很多实验

    有什么想法吗

    现实世界中的示例是一个单元格,其中包含一个标签(标签),然后是另一个标签或文本视图,其中包含一个值,可以按照本发明进行设置。因此,第一个标签是固定大小的,第二个理想情况下需要是最大值,但如果需要,则截断文本

    (请参阅“添加联系人”中的“铃声”或“振动设置”,了解我试图实现的示例)

    非常感谢,


    李。

    我也有同样的问题。我想在左侧布局一个图像视图,其右侧有一个标签,用于填充图像视图和superview(单元格的内容视图)的右(或尾随)边框之间的空间。附件视图也设置为显示指示器。 与您的情况一样,所有基于H的约束和我在日志中找到的一个约束冲突,其中
    fittingSizeHTarget
    。我不知道这意味着什么,也不知道这是从哪里来的,但我在这里找到了你的帖子

    下面是我的诀窍:

    降低标签尾部到superview约束的优先级。(我选择了990)。

    我假设,无论出于什么原因,布局系统(公开指示器可见)都不能满足所有约束,因此它打破了一个约束。但如果降低优先级,它仍会尝试满足约束,但不会破坏约束,因为冲突约束具有更高的优先级


    希望这也能解决您的问题。

    请注意斯蒂芬在投赞成票的答案的评论部分所说的话。向上投票的答案在某种程度上是正确的,但重要的是要理解为什么它只能在某些场景中使用

    优先级通常用于元素A有一个表示高度等于或小于/大于300的约束条件,元素B有一个表示高度等于或小于/大于500的约束条件。然后,自动布局可以根据优先级满足这两个条件


    在这个特定的例子中,两个约束都设置为特定的值,降低优先级本质上告诉我们,如果不可能满足该约束,则忽略该约束(不存在“部分忽略它”)但是UILabel有一个例外-默认的UILabel行为是调整自身大小以适应内容,除非它受到附加边距的约束(autosize约束隐藏在FittingSizeTarget名称下),并且此行为有时会显示错误警告。实际上,该约束将在运行时被忽略,但在内部禁用之前,它将提交一个警告。因此,即使我们要求通过降低优先级(我们将优先级设置为900)来忽略其中一个约束,因为自动调整大小约束在运行时将被忽略,我们的900优先级将得到应用和满足。

    Raimunda在上面的回答中解释了标签、按钮上发生的固有大小,etc就是这个FittingSizeTarget日志的来源。虽然您可以离开它,让系统来处理它,但这是一个风险很大的黑客行为,因为您依赖系统来打破一个不必要的约束……这在未来的版本中可能无法做到。在某些情况下,正如我最近处理的一个视图示例中所述,将尾部约束的优先级降低到外部安全区域并不能防止标签溢出(但它确实修复了日志警告lol)

    对于此类内容问题,请使用内容拥抱优先级内容压缩阻力优先级值。例如,如果您知道标签希望增加垂直高度,但将其约束为水平值,则应使垂直内容包围优先级(内容包围=视图被放大)低于水平

    压缩阻力与此相反

    然后将外部尾随约束设置为大于或等于,就可以开始了

    在下面的堆栈视图中,名为Fake 4的标签实际上超出了范围,希望变成两行。这导致了涉及FittingSizeTarget的冲突(固有内容大小希望保持在一行上,并超出视图宽度)。这里的关键是降低水平压缩阻力优先级,使其低于所有其他内容优先级。这允许我降低>=