在两个视图之间添加尾随约束

时间:2018-08-23 15:18:41

标签: ios objective-c constraints uislider uistackview

我被怪异的行为困住了

我以编程方式在'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附加了一些照片:

滑块

photo one

标签

photo two

1 个答案:

答案 0 :(得分:1)

这是因为您已将它们放置在stackview中! 因此,stackview正在抑制其他约束。

我怎么知道它被抑制了?

viewdebugger是一个非常强大的工具,但其大多数功能尚不清楚。

右侧约束的

颜色传达了含义。

  • 深黑色的约束正在起作用。
  • 浅灰色约束被忽略,或者是由于较高的优先级而被抑制,或者是约束之间存在冲突,这意味着布局引擎将自行决定。该决定的行为是不可预测的。

FWIW灰色和黑色约束均是活动的,但并非每个活动约束都被应用。例如您可能对标签的宽度有一百个约束,每个约束具有不同的优先级。当所有它们都处于活动状态时,除了具有最高优先级的约束之外,它们都将被忽略。

enter image description here

您会看到☝️label.trailing = self.trailing @1000被忽略了。而且当您将优先级设置为'1000'时,我非常确定调试器会向您转储警告,但是您在问题中并未提及它们。

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

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

我认为您可能需要的是

stackView.alignment = .trailing

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

如果您希望滑块延伸到stackview的整个宽度,则将其限制为stackview的宽度。标签从其intrinsicContentSize获得宽度,这很好。

enter image description here

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