带有 NSLayoutAttributeTrailing 的 NSLayoutConstraints 与预期不符
Posted
技术标签:
【中文标题】带有 NSLayoutAttributeTrailing 的 NSLayoutConstraints 与预期不符【英文标题】:NSLayoutConstraints with NSLayoutAttributeTrailing not as expected 【发布时间】:2014-11-26 18:07:23 【问题描述】:我有一个包含两个新约束的数组。
当我设置这些约束时,按钮被放置在距离超级视图中心 20 和 90 像素处。 我想要按钮距超级视图底部 20px 和距右侧 90px。 我究竟做错了什么? 我创建了一个包含两个约束的数组:
NSLayoutConstraint *bottomTrailingConstraint = [NSLayoutConstraint constraintWithItem:_gameSettingsButton
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:_gameSettingsButton.superview
attribute:NSLayoutAttributeTrailing
multiplier:1.0f
constant:90.0f];
NSLayoutConstraint *bottomSpaceConstraint = [NSLayoutConstraint constraintWithItem:_gameSettingsButton
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:_gameSettingsButton.superview
attribute:NSLayoutAttributeBottom
multiplier:1.0f
constant:20.0f];
_bottomConstraintsArray = @[bottomTrailingConstraint, bottomSpaceConstraint];
我删除旧约束,然后添加新约束:
NSArray *oldconstraints = _gameSettingsButton.constraints;
[_gameSettingsButton.superview removeConstraints: oldconstraints];
[_gameSettingsButton.superview addConstraints:_bottomConstraintsArray];
我也尝试过:[_gameSettingsButton.superview updateConstraints] 但这没有任何改变。
任何帮助将不胜感激。
【问题讨论】:
您希望您的按钮距离超级视图的右侧 90 像素,因此您需要NSLayoutAttributeRight
。另外,我只能看到 2 个约束。视图需要 4 个约束才能正确定位(例外是具有固定高度的视图,例如 UIPicker
、UIProgressBar
,只需要 3 个)。
【参考方案1】:
这个:
NSLayoutConstraint *bottomTrailingConstraint = [NSLayoutConstraint constraintWithItem:_gameSettingsButton
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:_gameSettingsButton.superview
attribute:NSLayoutAttributeTrailing
multiplier:1.0f
constant:90.0f];
意思是:
_gameSettingsButton.trailing == _gameSettingsButton.superview.trailing * 1 + 90
这将使按钮的后沿超出超级视图。假设从左到右布局(所以“尾随”意味着“右”),按钮的右边缘将在父视图右侧 90 点处。
同样,这个:
NSLayoutConstraint *bottomSpaceConstraint = [NSLayoutConstraint constraintWithItem:_gameSettingsButton
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:_gameSettingsButton.superview
attribute:NSLayoutAttributeBottom
multiplier:1.0f
constant:20.0f];
意思是:
_gameSettingsButton.bottom == _gameSettingsButton.superview.bottom * 1 + 20
同样,这会将按钮放在超级视图之外。按钮的底部边缘将比父视图的底部下降 20 点。
您要么想要交换第一项和第二项,要么想要否定常量。
此外,您正在从按钮查询约束,然后从超级视图中删除这些约束。好吧,因为您查询的约束不在超级视图上,所以什么都不做。 (事实上,您的查询结果可能是一个空数组,因为没有任何东西会向按钮本身添加任何约束。)您可能打算查询超级视图上的约束,但我怀疑会有与您没有的按钮无关的约束不想删除。因此,您需要记住为按钮设置的约束(可能在实例变量中)并删除它们。如果初始约束是在 IB 中设置的,那么您需要设置一个出口来跟踪它们。
【讨论】:
您好,Ken,非常感谢您的回答。交换第一个和第二个项目并将出口添加到原始约束解决了我的问题! 否定常数对我没有用,但交换项目解决了问题。以上是关于带有 NSLayoutAttributeTrailing 的 NSLayoutConstraints 与预期不符的主要内容,如果未能解决你的问题,请参考以下文章
如何翻转正面带有标签而背面带有另一个标签的视图 - 参见图片
CakePHP 如何处理带有/不带有 'id' 字段的 HABTM 表?
带有 RecyclerView 的 DialogFragment 比带有 Recyclerview 的 Fragment 慢