带有 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 个约束才能正确定位(例外是具有固定高度的视图,例如 UIPickerUIProgressBar,只需要 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 与预期不符的主要内容,如果未能解决你的问题,请参考以下文章

带有和不带有聚合的 sql 查询

如何翻转正面带有标签而背面带有另一个标签的视图 - 参见图片

CakePHP 如何处理带有/不带有 'id' 字段的 HABTM 表?

带有滚动的 Div 和带有绝对位置的内容

带有 RecyclerView 的 DialogFragment 比带有 Recyclerview 的 Fragment 慢

访问控制允许带有和不带有 www 的来源