iPhone X 界面编程无自动布局

Posted

技术标签:

【中文标题】iPhone X 界面编程无自动布局【英文标题】:iPhone X interface programming without autolayout 【发布时间】:2017-10-24 16:45:08 【问题描述】:

我有一个旧的应用程序源代码,它使用没有自动布局或大小类的故事板和 xib。即使我从头开始重写它,由于模块数量太多,这需要一些时间。迫切需要通过在运行时检测屏幕大小来修复手动设置 UI 元素框架的代码。所以这样写的代码会将元素放在安全区域之外:

  self.controlBarBkg568h.frame = CGRectMake(0, CGRectGetHeight(self.view.bounds) - tapBarBackgroundImage.size.height, CGRectGetWidth(self.view.bounds), tapBarBackgroundImage.size.height);

既然有这么多界面元素是这样放置的,我想知道有什么简单的方法可以修复适用于 iPhone X 的代码?

【问题讨论】:

【参考方案1】:

UIView 上使用safeAreaInsets 属性。这是一个UIEdgeInsets 对象,描述了当前视图的安全区域。 (Documentation)

在您的具体情况下,您应该能够将代码更改为以下内容:

self.controlBarBkg568h.frame = CGRectMake(0, CGRectGetHeight(self.view.bounds) - tapBarBackgroundImage.size.height - self.view.safeAreaInsets.bottom, CGRectGetWidth(self.view.bounds), tapBarBackgroundImage.size.height);

如果您有许多以这种方式定位的视图,则必须全部编辑它们以尊重安全区域。这是手动布局的缺点之一 - 将来很难更改(特别是如果没有任何帮助布局变量可以一次编辑多个变量)。

有关相对于安全区域定位内容的更多文档可在此处获得:https://developer.apple.com/documentation/uikit/uiview/positioning_content_relative_to_the_safe_area

【讨论】:

我认为 0 也需要替换为 self.view.safeAreaInsets.left @DeepakSharma 你是对的,但这取决于你的用例。如果您在 iPhone X 上支持横向并希望您的视图尊重左右安全区域,则需要考虑安全区域。

以上是关于iPhone X 界面编程无自动布局的主要内容,如果未能解决你的问题,请参考以下文章

自动布局以编程方式导致 iphone 4 出现问题

自动布局和对齐约束

自动布局无法正确处理 iPhone X 缺口

自动布局 iPhone 6 不起作用

自动布局 – iPhone X/11 设备上的宽度不一致

更新自定义导航栏透明图像自动布局 Iphone X?