我正在使用新的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进行简单练习。
每个约束的首选项设置设置为1000,设备设置为iPhone 6s。
但iPhone 6 / s或我的设备iPhone 6上的结果发生了变化:
因此,当我开始摆弄时,我发现如果将故事板设备设置为iPhone SE,它将在iPhone 6模拟器和iPhone 6设备上正确显示内容:
错误的设置现在已经对齐了。我是否错过了新的Xcode版本以及如何使用自动布局和约束?
谢谢 甲
答案 0 :(得分:2)
如果baseInit
正在对UIViews和帧大小做任何事情,您应该在viewDidLayoutSubviews
内调用它。在视图根据视图的约束布局后调用。
static dispatch_once_t oncePerLoadToken;
- (void)viewDidLoad {
[super viewDidLoad];
oncePerLoadToken = 0;
}
- (void)viewDidLayoutSubviews {
dispatch_once(&oncePerLoadToken, ^{
[self baseInit];
});
}