Apple documentation关于在视图与其中一个布局指南之间创建自动布局约束仅显示使用VFL的示例。
有没有办法以编程方式不使用 VFL创建这些约束(使用NSLayoutConstraint
's other API或类似)?
(注意:我特别要求在代码中执行此操作,而不是在Interface Builder中。我不希望指南集的计算length
作为约束的静态常量,我想要一个约束,其中布局引导长度的更改将自动导致约束视图调整位置。)
答案 0 :(得分:93)
对于UIButton
您希望在UIViewController.topLayoutGuide
以下20分的位置,您可以创建NSLayoutConstraint
,如下所示:
[NSLayoutConstraint constraintWithItem:self.button
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.topLayoutGuide
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:20.0];
使用iOS 9,您还可以通过以下方式创建NSLayoutConstraint
:
[self.button.topAnchor constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor
constant:20.0];
答案 1 :(得分:5)
为了补充@ JamieMcDaniel的答案,Swift + iOS9版本将是:
self.button.topAnchor
.constraintEqualToAnchor( self.topLayoutGuide.bottomAnchor ).active = true
不要忘记.active = true
部分,否则约束不会自动启动。
答案 2 :(得分:3)
这是我创建的gist,您应该将所有子视图嵌入到添加到xib中的tank视图(容器视图)中,它会删除tank view-superview xib约束并添加上限制topLayoutGuide给出iOS6外观。你希望实现的目标可能很有趣。
//This should be added before the layout of the view
- (void) adaptToTopLayoutGuide {
//Check if we can get the top layoutguide
if (![self respondsToSelector:@selector(topLayoutGuide)]) {
return;
}
//tankView is a contaner view
NSArray * array = [self.tankView referencingConstraintsInSuperviews]; //<--For this method get the Autolayout Demistified Book Sample made by Erica Sadun
[self.view removeConstraints:array];
NSArray * constraintsVertical = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topLayoutGuide]-0-[tankView]|" options:0 metrics:nil views:@{@"tankView": self.tankView, @"topLayoutGuide":self.topLayoutGuide}];
[self.view addConstraints:constraintsVertical];
NSArray * constraintsHorizontal = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tankView]|" options:0 metrics:nil views:@{@"tankView": self.tankView}];
[self.view addConstraints:constraintsHorizontal];
}
答案 3 :(得分:3)
只是@Jamie McDaniel的补充,如果不是很明显,你需要添加他建议创建的约束:
NSLayoutConstraint *buttonTopConstraint = [NSLayoutConstraint constraintWithItem:self.button
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.topLayoutGuide
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:20.0];
[self.view addConstraint:buttonTopConstraint];