3

We have some legacy projects that are still using Autoresizing masks, and everything was working fine until iOS 11 and iPhone X. With the introduction of safe area layout guides, what's the best solution to support iPhone X?

  1. We can convert all interfaces with autoresizing masks to use auto-layouts. This appears to be a significant effort, considering views are being dynamically added and adjusted.

  2. We keep using autoresizing masks but adjust the interfaces to add inset margins for iPhone X and iOS 11.

4

2 回答 2

6

以下是我使用 XIB 文件和自动调整布局的遗留项目解决此问题的方法:

  1. 在 Interface Builder 中,为 XIB 启用自动布局并打开 Safe Areas。
  2. 选择视图中的所有 UI 元素,然后选择 Editor->Embed In->View。此技巧保留所选元素的自动调整大小设置。
  3. 在创建的新 UIView 中,使用 Auto-layout 将顶部、前导、底部和后沿设置为超级视图安全区域。

这对我的项目非常有用,可以在我的许多 XIB 文件中快速支持安全区域,而无需从自动调整大小更改为自动布局。

韦斯

于 2017-11-03T19:33:36.340 回答
3

第三种选择是在需要的地方使用自动布局,并让应用程序的其余部分自动调整大小。从 XCode 8 开始,您可以混合使用自动调整大小和自动布局。对于 xib 或情节提要中的每个视图,您可以选择设置自动调整掩码或自动布局约束。在视图上使用一种规则会禁用该视图的另一种规则。但是你可以在另一个视图上使用另一种。此链接有更多信息:http ://www.thomashanning.com/xcode-8-mixing-auto-autoresizing-masks/

如果您选择继续使用自动调整大小的遮罩,下面的辅助方法可以帮助您正确布局视图。

statusBarHeight为您提供设备状态栏的高度。safeAreaBottomMargin为您提供 iPhoneX 主页按钮指示器的左下边距。

- (CGFloat) statusBarHeight {
    return UIApplication.sharedApplication.statusBarFrame.size.height;
}

- (CGFloat) safeAreaBottomMargin {
    if (@available(iOS 11.0, *)) {
        UIWindow *window = UIApplication.sharedApplication.windows.firstObject;
        return window.safeAreaLayoutGuide.owningView.frame.size.height - window.safeAreaLayoutGuide.layoutFrame.size.height - window.safeAreaLayoutGuide.layoutFrame.origin.y;
    } else {
        return 0;
    }
}
于 2017-09-21T19:59:10.053 回答