繁体   English   中英

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

[英]Add trailing constraint between two views

我被一个奇怪的行为卡住了

我以编程方式在 '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 的照片:

滑块

照片一

标签

照片二

这是因为你已经把这些放在了一个堆栈视图中! 因此,stackview 正在抑制其他约束。

我怎么知道它被压制了?

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

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

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

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

在此处输入图片说明

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

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

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

我想你可能需要的是

stackView.alignment = .trailing

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

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

在此处输入图片说明

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM