Xcode 8 - Autolayouts问题

时间:2016-10-05 23:05:52

标签: ios objective-c xcode ios-autolayout

我正在使用新的Xcode设置基本的UIView子类,并且遇到了奇怪的行为。子视图似乎在第一眼就正常加载:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
        if (self) {
            [self baseInit];
}
    return self;
}
- (void)awakeFromNib
{
    [super awakeFromNib];
    [self baseInit];
}

我开始在设置为iPhone 6大小的故事板中构建另一个容器视图,就像我拥有的​​一样。我的布局有点复杂,只有很少的对象,即使我擅长设置约束,它也会被移位。

所以我开始尝试简单的视图,看看Xcode升级后问题出在哪里。

使用2个UIViews进行简单练习。

enter image description here

每个约束的首选项设置设置为1000,设备设置为iPhone 6s。 enter image description here

但iPhone 6 / s或我的设备iPhone 6上的结果发生了变化:

enter image description here

因此,当我开始摆弄时,我发现如果将故事板设备设置为iPhone SE,它将在iPhone 6模拟器和iPhone 6设备上正确显示内容:

enter image description here enter image description here

错误的设置现在已经对齐了。我是否错过了新的Xcode版本以及如何使用自动布局和约束?

谢谢 甲

1 个答案:

答案 0 :(得分:2)

如果baseInit正在对UIViews和帧大小做任何事情,您应该在viewDidLayoutSubviews内调用它。在视图根据视图的约束布局后调用。

static dispatch_once_t oncePerLoadToken;

- (void)viewDidLoad {
    [super viewDidLoad];
    oncePerLoadToken = 0;
}

- (void)viewDidLayoutSubviews {
    dispatch_once(&oncePerLoadToken, ^{
        [self baseInit];
    });
}