在两个视图之间添加尾随约束
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 时不应用尾随约束