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

Posted

技术标签:

【中文标题】在两个视图之间添加尾随约束【英文标题】:Add trailing constraint between two views 【发布时间】:2018-08-23 15:18:41 【问题描述】:

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

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

滑块

标签

【问题讨论】:

在您的图像中不清楚是什么。 1) UISlider 上的第一个屏幕截图和标签上的另一个屏幕截图是唯一的吗? 2) 你是否改变了你的 viewdebugger 设置? 您是否将标签和滑块上的translatesautoresizingmaskintoconstraints 设置为false 1.我没有对调试器做任何事情 2.是的,我将其设置为 false 你对你的_seekBar做了什么奇怪的事情吗?根据您的图像,它的frame width 大于它的bounds width... 这是因为您已将这些放置在堆栈视图中。我对吗?这使事情变得复杂...... 【参考方案1】:

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

我怎么知道它被抑制了?

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

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

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

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

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

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

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

我认为你可能需要的是

stackView.alignment = .trailing

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

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

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

【讨论】:

以上是关于在两个视图之间添加尾随约束的主要内容,如果未能解决你的问题,请参考以下文章

故事板自动布局将视图放置在表格单元格中,并将尾随到超级视图约束固定到最左侧

以编程方式添加 UIConstraints 时不应用尾随约束

如何在设备旋转后重新计算约束

向底部锚添加约束是向超级视图底部添加约束

向其子视图(即 UILabel)添加约束时,无法保持集合视图单元格的固定大小

如何在图像视图周围制作圆形边框