利用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 这样的大问题等着我们去适配…

总结

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

时间: 2017-09-16

利用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

IOS swift中的动画的实例详解

IOS swift中的动画的实例详解 UIView的通用动画 let view = UIView(frame: CGRectMake(10.0, 10.0, 100.0, 40.0)) self.view.addSubview(view) view.backgroundColor = UIColor.lightGrayColor() // 位置改变 var frame = view.frame UIView.animateWithDuration(0.6, delay: 2.0, options

Java 利用dom方式读取、创建xml详解及实例代码

Java 利用dom方式读取.创建xml详解 1.创建一个接口 XmlInterface.Java public interface XmlInterface { /** * 建立XML文档 * @param fileName 文件全路径名称 */ public void createXml(String fileName); /** * 解析XML文档 * @param fileName 文件全路径名称 */ public void parserXml(String fileName); }

Android 判断网络状态实例详解

Android 判断网络状态实例详解 实例代码 package com.example.android; import java.io.IOException; import java.net.HttpURLConnection; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.URL; import java.util.

java 与testng利用XML做数据源的数据驱动示例详解

java 与testng利用XML做数据源的数据驱动示例详解 testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,YAML,甚至可以是TXT文本.在这以XML为例: 备注:@DataProvider的返回值类型只能是Object[][]与Iterator<Object>[] TestData.xml: <?xml version="1.0" encoding="UTF-8"?> <

与Django结合利用模型对上传图片预测的实例详解

1 预处理 (1)对上传的图片进行预处理成100*100大小 def prepicture(picname): img = Image.open('./media/pic/' + picname) new_img = img.resize((100, 100), Image.BILINEAR) new_img.save(os.path.join('./media/pic/', os.path.basename(picname))) (2)将图片转化成数组 def read_image2(file

Linux中利用sudo进行赋权的方法详解

前言 学习怎么在保护 root 密码的安全性的同时,为可信用户赋予所管理的网络功能和特定服务的权限. 我最近写了一个简短的 Bash 程序来将 MP3 文件从一台网络主机的 USB 盘中拷贝到另一台网络主机上去.拷贝出来的文件存放在一台志愿者组织所属服务器的特定目录下,在那里,这些文件可以被下载和播放. 我的程序还会做些其他事情,比如为了自动在网页上根据日期排序,在拷贝文件之前会先对这些文件重命名.在验证拷贝完成后,还会删掉 USB 盘中的所有文件.这个小程序还有一些其他选项,比如 -h 会显示

如何从零开始利用js手写一个Promise库详解

前言 ECMAScript 是 JavaScript 语言的国际标准,JavaScript 是 ECMAScript 的实现.ES6 的目标,是使得 JavaScript 语言可以用来编写大型的复杂的应用程序,成为企业级开发语言. 概念 ES6 原生提供了 Promise 对象. 所谓 Promise,就是一个对象,用来传递异步操作的消息.它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的 API,可供进一步处理. 三道思考题 刚开始写前端的时候,处理异步请求经常用