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 这样的大问题等着我们去适配…
少年 话说你提交审核的时候 苹果的评审人员 用的 可是 iPad 运行 iPhone app
这种判断分辨率的搞法 不是特别好
最好用 判断 屏幕的 tabbar 高度来解决这种问题
如果我没做错 你 提交审核的时候 貌似会被拒 不如果不被拒请邮件 告诉我一下 也算我学习了
谢谢提醒。确实我没想到在 iPad 上审核 iPhone App 这个情况,那么我在文章中再补充一下吧!
在iPad上运行会有什么问题呢, 在iPad上高度也不是812 啊
UIScreen横屏时候的高度是375。。。通过尺寸判断真的算是下下策了。
「标准视图」是这个高度:UIScreen.main.bounds.height == 812,
但是如果用户是「放大视图」就不是这个高度了呀。
所以说这个方法判断机型是有问题的。
代码能配置个高亮吗?