San*_*der 7 interface-builder ios autolayout nslayoutconstraint size-classes
我为这个案子做了一个特殊的测试应用程序.(对不起,已经删除了)
我在控制器的视图中添加了一个视图Storyboard,设置了AutoLayout约束Interface Builder,并使其中一个(垂直空间)不同于不同的大小类.IB的截图
所以值为100 for Any height, Any width和0 for Regular height, Regular width.它运行良好,在iPhone上垂直距离顶部是100,在iPad上它是0.
此外,我IBOutlet为此约束做了,并希望在运行时将其更改为10
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *topVerticalConstraint;
Run Code Online (Sandbox Code Playgroud)
似乎我无法改变它,因为它没有任何效果
- (void)viewDidLoad
{
[super viewDidLoad];
self.topVerticalConstraint.constant = 10; // it doesn't work
}
Run Code Online (Sandbox Code Playgroud)
虽然它在我删除Regular height, Regular widthin的时候有效Interface Builder.
我想念大小班吗?
NKo*_*kov 13
问题是,在布局事件发生之间-viewWillLayoutSubviews以及-viewDidLayoutSubviews来自IB的所有参数发挥作用之前,约束尚未完全定义.我的经验法则是:
第二个陈述仅考虑对IB中的约束进行代码调整.您在-viewDidLoad中进行的调整将被布局期间在IB中设置的参数覆盖.如果使用代码添加约束,可以在-viewDidLoad中设置它们,因为没有任何内容可以覆盖它们.
我已经改变了你的代码并且它有效:
#import "ViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *topVerticalConstraint;
@property (weak, nonatomic) IBOutlet UIView *square;
@property (assign, nonatomic) BOOL firstLayout;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.firstLayout = YES;
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
if (self.firstLayout) {
self.topVerticalConstraint.constant = 10;
self.firstLayout = NO;
}
}
@end
Run Code Online (Sandbox Code Playgroud)
请注意,-viewDidLayoutSubviews在ViewController的生命周期中多次调用,因此您必须确保在初始加载时仅进行一次调整.
| 归档时间: |
|
| 查看次数: |
4767 次 |
| 最近记录: |