1

我被一种奇怪的行为困住了

我以编程方式在“UISlider”和“UILabel”之间添加了一个尾随约束,它看起来像这样:

NSLayoutConstraint *timeLabelTrailing = [NSLayoutConstraint
                                             constraintWithItem:_timeLbl
                                             attribute:NSLayoutAttributeTrailing
                                             relatedBy:NSLayoutRelationEqual
                                             toItem:_seekBar
                                             attribute:NSLayoutAttributeTrailing
                                             multiplier:1
                                             constant:0];

    [timeLabelTrailing setActive:true];
    [self layoutIfNeeded];

并且“UILabel”尾随与“UISlider”尾随不匹配。

我试图在“UILabel”和“UIViewControoler”视图之间做同样的事情,它工作得很好,但是使用“UISlider”就出错了。

附上一些来自 ViewDebugger 的照片:

滑块

照片一

标签

照片二

4

1 回答 1

1

这是因为您已将这些放置在堆栈视图中!因此,stackview 正在抑制其他约束。

我怎么知道它被压制了?

viewdebugger 是一个非常强大的工具,但它的大部分功能是未知的。

右侧约束的颜色传达了含义。

  • 深黑色的约束正在产生影响。
  • 浅灰色的约束被忽略,要么是因为被更高的优先级抑制,要么是约束之间的冲突,这意味着布局引擎将自行决定。这个决定的行为是不可预测的。

FWIW 灰色和黑色约束都处于活动状态,但并非每个活动约束都被应用。例如,您可以对标签的宽度设置数百个约束,每个约束具有不同的优先级。虽然它们都处于活动状态,但它们将被忽略,除了具有最高优先级的约束。

在此处输入图像描述

正如你所看到的 ☝️thelabel.trailing = self.trailing @1000被忽略了。当您忽略“1000”的优先级时,我很确定调试器正在向您转储警告,但您没有在问题中提及它们。

长话短说,当您将内容放在堆栈视图中时,您自己不应该添加太多约束。

  • 应尽量避免与“位置”相关的约束。
  • '大小' 相关的约束是可以接受的。

我想你可能需要的是

stackView.alignment = .trailing

并确保删除其他尾随约束。

如果你想让你的滑块拉伸到堆栈视图的整个宽度,那么将它限制到堆栈视图的宽度。标签从中获取宽度intrinsicContentSize,这很好。

在此处输入图像描述

TBH 我不确定这是否是最好的方法,但我认为它有效。如果有人知道更好的方法,请发表评论。

于 2018-08-23T15:42:53.613 回答