以编程方式添加 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:重写时不应使用子类参数