利用Swift如何判断iPhone X机型详解

前言

Apple Special Event 已经结束,iPhone 三款新机型和技术细节也已完全暴露。可以说,发布会前泄漏了 95% 以上的信息,以致于发布会一点惊喜也没有。

尽管 iPhone 8 实际上只是 iPhone 7s,而 iPhone X 我们也早已对它非常熟悉——特别是刘海。无论是满意还是失望,作为 iOS 开发者的我,还是得积极的适配起这款面向未来的机型。

我将在一边适配的过程中,一边从技术角度更多地去理解这款机器。

奇点在 iPhone X 的 break

除非你的 App 全部使用了 iPhone 原生组件、AutoLayout 等等,否则我想它或多或少存在着在 iPhone X 上的兼容性问题。就拿奇点来说吧,早上我下载完 Xcode 9 GM,然后在 iPhone X 模拟器跑起了它,很快我就看到了 break:我自定义 TabBar 的问题。

上图可以看到,Home Indicator 和 TabBar 几乎混在了一块。

那么为什么会这样?这要和奇点稍微 Hack 过的 UITabBar 有关系。用过奇点的朋友应该知道,奇点的 TabBar 是没有文字的、纯图片的 TabBar,它的高度不是标准的 49,而是 44,我在 UITabBarController 的 viewWillLayoutSubviews 方法做了一个手动调整布局以达到这个效果。但很明显,这个 Hack 在 iPhone X 上不起作用了。

var tabFrame = self.tabBar.frame
tabFrame.size.height = MainTabBarController.tabBarHeight
tabFrame.origin.y = self.view.frame.size.height - MainTabBarController.tabBarHeight
self.tabBar.frame = tabFrame

解决 iPhone X 上的 TabBar 问题

解决这个问题也很简单,当我把 Hack 的代码注释掉以后就工作正常了。如图:

为保证奇点在 iOS 11 的其他机型上继续工作正常,我得写一个判断,只在 iPhone X 上禁用这个 Hack。

那么如何判断当前的设备是 iPhone X 呢?有好几种办法,可以考虑取得「iPhone 10,1」这样的 Module Name 来判断,也可以用屏幕分辨率的形式来判断。我觉得要用屏幕分辨率的方式来做,因为这是目前为止最简单也最不容易出错的。因为 iPhone X 只有一种分辨率,那就是 812pt x 375pt (@3x),且没有任何其他设备用了一样的分辨率,特别是高度。

于是写了一个基于 UIDevice 的扩展(或者其他任意方法也行):

extension UIDevice {
  public func isX() -> Bool {
    if UIScreen.main.bounds.height == 812 {
      return true
    }

    return false
  }
}

在代码中,就可以用 UIDevice.current.isX() 来判断是不是跑在 iPhone X 机型上,然后做一些或不做一些特殊的 Hack 了。

小结

奇点实际上还有各种各样在 iPhone X(甚至只是 iOS 11)上的小问题,大问题在过去的一段时间我差不多都解决了,我想这段时间我会不断地整理出一些技术文章来和大家分享。

总得来说,对于奇点这样的微博客户端,这次对 iOS 11 的适配,改动量非常大,以致于我有点不高兴。比如 Social 这个 Framework,Apple 居然把所有社交网络帐户分享的功能给去掉了,这使得奇点的「同步到 Twitter」这样的功能不能再调用系统的,只能自己重写。

另外,iOS 11 将 UINavigationBar 的自定义规范到了严格的程度,如果你有没有用 AutoLayout,或者 Custom TitleView 有问题,都会有很多意想不到的问题发生。

这些问题解决后,还有 iPhone X 这样的大问题等着我们去适配…

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • 利用Swift如何判断iPhone X机型详解

    前言 Apple Special Event 已经结束,iPhone 三款新机型和技术细节也已完全暴露.可以说,发布会前泄漏了 95% 以上的信息,以致于发布会一点惊喜也没有. 尽管 iPhone 8 实际上只是 iPhone 7s,而 iPhone X 我们也早已对它非常熟悉--特别是刘海.无论是满意还是失望,作为 iOS 开发者的我,还是得积极的适配起这款面向未来的机型. 我将在一边适配的过程中,一边从技术角度更多地去理解这款机器. 奇点在 iPhone X 的 break 除非你的 App

  • 利用Swift如何计算文本的size示例详解

    前言 对于swift 还处于摸索阶段很多语法还不熟悉,本文主要给大家介绍的是关于利用Swift计算文本size的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. iOS 11之前限制宽高计算字符串的size用的是UILabel的textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect方法,当时也没考虑线程安全问题(low爆了),Xcode也没提示,用了好

  • 利用Swift实现各类的CATransition动画详解

    前言 最近因为工作的需要,打算用swift重构现有项目,实现过程中发现用到了很多系统的动画实现,因为之前的都是用OC实现的,这里主要是把一些动画效果来通过swift实现一下. 这篇文章主要是实现一下CATransition动画的不同效果. 第一步 创建一个swift文件并声明相应的枚举类型 enum TransitionAnimType : Int { case fade = 0, //淡入淡出 push, //推挤 reveal, //揭开 moveIn, //覆盖 cube, //立方体 s

  • Java8利用Stream实现列表去重的方法详解

    目录 一. Stream 的distinct()方法 1.1 对于 String 列表的去重 1.2 对于实体类列表的去重 二. 根据 List<Object> 中 Object 某个属性去重 2.1 新建一个列表出来 2.2 通过 filter() 方法 一. Stream 的distinct()方法 distinct()是Java 8 中 Stream 提供的方法,返回的是由该流中不同元素组成的流.distinct()使用 hashCode() 和 eqauls() 方法来获取不同的元素.

  • Swift 中的 JSON 反序列化示例详解

    目录 业界常用的几种方案 手动解码方案,如 Unbox(DEPRECATED) 阿里开源的 HandyJSON 基于 Sourcery 的元编程方案 Swift build-in API Codable 属性装饰器,如 BetterCodable 各个方案优缺点对比 Codable 介绍 原理浅析 Decoder.Container 协议 自研方案 功能设计 Decoder.Container 具体实现 再议 PropertyWrapper 应用场景示例 单元测试 性能对比 业界常用的几种方案

  • Java利用位运算实现加减乘除的方法详解

    目录 前言 一.常见位运算 1. &运算 2. |运算 3. ^运算 4. ~运算 二.位运算实现加法 三.位运算实现减法 四.位运算实现乘法 五.位运算实现除法 前言 我们经常使用的加减乘除,我们所看到的只是表面的效果,那么加减乘除在底层究竟是怎么实现的?今天就让我们一探究竟.今天用位运算实现的加减乘除不使用任何的加减乘除符号. 一.常见位运算 1. &运算 &运算二进制每一位全1为1,否则为0 public static void main(String[] args) { i

  • Matlab利用遗传算法GA求解非连续函数问题详解

    目录 遗传算法基本思想 遗传算法的主要步骤 遗传编码 二进制编码 实数编码 遗传算法流程 实际演示 遗传算法基本思想 遗传算法(Genetic Algorithm, GA)起源于对生物系统所进行的计算机模拟研究.它是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法,借鉴了达尔文的进化论和孟德尔的遗传学说.其本质是一种高效.并行.全局搜索的方法,能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应地控制搜索过程以求得最佳解. 遗传算法的主要步骤 (1)编码:将问题的候选解用染色体表示,实

  • swift语言Codable 用法及原理详解

    目录 Codable Codable 的用法 JSON 和 模型的相互转换 解码(JSON Data -> Model): 编码(Model -> JSON Data): Codable 支持的数据类型 基础数据类型 Date 嵌套对象 枚举 自定义 CodingKeys Codable 的原理 Decodable 协议 Container 核心原理分析(Container <--> JSON) JSONDecoder 的解码过程 编译器帮我们做了什么? 默认值问题 属性包装器 @

  • Qt利用QJson实现解析数组的示例详解

    目录 前言 第一步:进行数据转换 第二步:将字符串转成QJsonDocument格式 第三步:解析json数据 前言 现在有这样一个json结构,需要使用QJson来解析,结构如下: "code": "0001", "descrip": "文本描述1详细描述", "id": "1", "title": "文本1标题", "type&quo

  • Java利用位运算实现加减运算详解

    目录 前言 思路分析 示例 位运算进位 初步结果 去除加号 整体思路 加法代码实现 减法实现 减法分析 减法代码实现 总结 前言 本文主要介绍如何使用位运算来实现加减功能,也就是在整个运算过程中不能出现加减符号. 加减乘除运算在计算机中,实际上都是用位运算实现的,今天就用位运算来模拟下加法和减法的运算功能. 思路分析 先分析如何用位运算实现加法运算. 示例 假设a=23,b=36,使用位运算实现加法得到结果59. 首先来看下23.36.59的二进制信息. 从上面的图中可以看到,两个数相加的结果与

随机推荐