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

Posted

技术标签:

【中文标题】以编程方式添加 UIConstraints 时不应用尾随约束【英文标题】:Trailing constraint not applying when programmatically adding UIConstraints 【发布时间】:2017-02-03 10:35:40 【问题描述】:

我正在尝试通过代码将子视图添加到具有约束的视图中。我取得了一些成功,但无论出于何种原因,尾随约束似乎都被完全忽略了。

我的代码:

leading_const = 16.f;
trailing_const = 16.f;
top_const = 12.f;
bottom_const = 12.f;


insertView.translatesAutoresizingMaskIntoConstraints = NO;
[view addSubview:insertView];
NSLayoutConstraint *leading = [NSLayoutConstraint constraintWithItem:insertView
                                                           attribute:NSLayoutAttributeLeading
                                                           relatedBy:NSLayoutRelationEqual
                                                              toItem:view
                                                           attribute:NSLayoutAttributeLeading
                                                          multiplier:1.f
                                                            constant:leading_const];
NSLayoutConstraint *trailing = [NSLayoutConstraint constraintWithItem:insertView
                                                            attribute:NSLayoutAttributeTrailing
                                                            relatedBy:NSLayoutRelationEqual
                                                               toItem:view
                                                            attribute:NSLayoutAttributeTrailing
                                                           multiplier:1.f
                                                             constant:trailing_const];
NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:insertView
                                                       attribute:NSLayoutAttributeTop
                                                       relatedBy:NSLayoutRelationEqual
                                                          toItem:view
                                                       attribute:NSLayoutAttributeTop
                                                      multiplier:1.f
                                                        constant:top_const];
NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:insertView
                                                                   attribute:NSLayoutAttributeHeight
                                                                   relatedBy:NSLayoutRelationEqual
                                                                      toItem:nil
                                                                   attribute:NSLayoutAttributeHeight
                                                                  multiplier:1.f
                                                                    constant:130.f];
[superView addConstraints:@[leading, trailing, top, height]];

结果:

感谢任何指导!

【问题讨论】:

您在哪个函数中添加约束? 你不应该将约束添加到视图吗? 你可以调用 NSLayoutConstraint.activate(@[leading, trailing, top, height]) 尾随约束应为负值,才有效。试试吧 @Pavankumar 就是这样!!有趣的是,为什么它在代码中是负值,而在界面构建器中却是正值? 【参考方案1】:

正在应用您的约束,但由于您已将其设置为16,它会超出view 的后缘16 个点。因此,您应该对常量使用负值。

【讨论】:

这解决了!有趣的是,为什么它在代码中是负值,而在界面构建器中却是正值? 这取决于您如何将视图与约束相关联。在您的情况下,您将insertView 的后缘与view 的后缘相关联,因此您必须将其从view 的边缘移回16 个点。如果您要以另一种方式关联您的视图,view --> insertView,那么您将使用一个正数将其从insertView 的后缘向前移动 16 个点。我希望这是有道理的。 感谢您的解释!完全有道理。 @Hodson 感谢您的解释。它解决了我的问题。

以上是关于以编程方式添加 UIConstraints 时不应用尾随约束的主要内容,如果未能解决你的问题,请参考以下文章

UIView(放置在滚动视图内)在以编程方式更改高度常量时不显示其子视图

能够记住重新打开应用程序时不应显示哪些相机胶卷照片(ios)

编写高质量代码改善C#程序的157个建议——建议99:重写时不应使用子类参数

第一次运行插入查询由于 E 列而出现重复,并且在运行超过一次时不应插入重复记录

如何以编程方式断开播放设备(苹果电视)?

Magento:以编程方式从属性集中删除属性