Xcode 8 - 自动布局问题

Posted

技术标签:

【中文标题】Xcode 8 - 自动布局问题【英文标题】:Xcode 8 - Autolayouts Issue 【发布时间】:2016-10-05 23:05:52 【问题描述】:

我正在使用新的 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 个 UIView 的简单练习。

首选项设置为每个约束设置为 1000,设备设置为 iPhone 6s。

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

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

设置错误,现在已对齐。我是否遗漏了新 Xcode 版本中的某些内容以及如何使用自动布局和约束?

谢谢 A.

【问题讨论】:

【参考方案1】:

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

static dispatch_once_t oncePerLoadToken;

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


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

【讨论】:

以上是关于Xcode 8 - 自动布局问题的主要内容,如果未能解决你的问题,请参考以下文章

从 Xcode 8 转换为 Xcode 9 的项目的自动布局失败

自动布局问题 Xcode 8 [_SwiftValue nsli_superitem]

带有约束的滚动视图自动布局问题 xcode 8

自动布局不会在 iOS 8-Xcode 6 中立即更新帧

转 iOS 8 Auto Layout界面自动布局系列2-使用Xcode的Interface Builder添加布局约束

项目从Xcode 8转换为Xcode 9时自动布局失败