利用Swift如何判斷iPhone X機(jī)型詳解
前言
Apple Special Event 已經(jīng)結(jié)束,iPhone 三款新機(jī)型和技術(shù)細(xì)節(jié)也已完全暴露??梢哉f(shuō),發(fā)布會(huì)前泄漏了 95% 以上的信息,以致于發(fā)布會(huì)一點(diǎn)驚喜也沒(méi)有。
盡管 iPhone 8 實(shí)際上只是 iPhone 7s,而 iPhone X 我們也早已對(duì)它非常熟悉——特別是劉海。無(wú)論是滿意還是失望,作為 iOS 開(kāi)發(fā)者的我,還是得積極的適配起這款面向未來(lái)的機(jī)型。
我將在一邊適配的過(guò)程中,一邊從技術(shù)角度更多地去理解這款機(jī)器。
奇點(diǎn)在 iPhone X 的 break
除非你的 App 全部使用了 iPhone 原生組件、AutoLayout 等等,否則我想它或多或少存在著在 iPhone X 上的兼容性問(wèn)題。就拿奇點(diǎn)來(lái)說(shuō)吧,早上我下載完 Xcode 9 GM,然后在 iPhone X 模擬器跑起了它,很快我就看到了 break:我自定義 TabBar 的問(wèn)題。

上圖可以看到,Home Indicator 和 TabBar 幾乎混在了一塊。
那么為什么會(huì)這樣?這要和奇點(diǎn)稍微 Hack 過(guò)的 UITabBar 有關(guān)系。用過(guò)奇點(diǎn)的朋友應(yīng)該知道,奇點(diǎn)的 TabBar 是沒(méi)有文字的、純圖片的 TabBar,它的高度不是標(biāo)準(zhǔn)的 49,而是 44,我在 UITabBarController 的 viewWillLayoutSubviews 方法做了一個(gè)手動(dòng)調(diào)整布局以達(dá)到這個(gè)效果。但很明顯,這個(gè) 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 問(wèn)題
解決這個(gè)問(wèn)題也很簡(jiǎn)單,當(dāng)我把 Hack 的代碼注釋掉以后就工作正常了。如圖:

為保證奇點(diǎn)在 iOS 11 的其他機(jī)型上繼續(xù)工作正常,我得寫一個(gè)判斷,只在 iPhone X 上禁用這個(gè) Hack。
那么如何判斷當(dāng)前的設(shè)備是 iPhone X 呢?有好幾種辦法,可以考慮取得「iPhone 10,1」這樣的 Module Name 來(lái)判斷,也可以用屏幕分辨率的形式來(lái)判斷。我覺(jué)得要用屏幕分辨率的方式來(lái)做,因?yàn)檫@是目前為止最簡(jiǎn)單也最不容易出錯(cuò)的。因?yàn)?iPhone X 只有一種分辨率,那就是 812pt x 375pt (@3x),且沒(méi)有任何其他設(shè)備用了一樣的分辨率,特別是高度。

于是寫了一個(gè)基于 UIDevice 的擴(kuò)展(或者其他任意方法也行):
extension UIDevice {
public func isX() -> Bool {
if UIScreen.main.bounds.height == 812 {
return true
}
return false
}
}
在代碼中,就可以用 UIDevice.current.isX() 來(lái)判斷是不是跑在 iPhone X 機(jī)型上,然后做一些或不做一些特殊的 Hack 了。
小結(jié)
奇點(diǎn)實(shí)際上還有各種各樣在 iPhone X(甚至只是 iOS 11)上的小問(wèn)題,大問(wèn)題在過(guò)去的一段時(shí)間我差不多都解決了,我想這段時(shí)間我會(huì)不斷地整理出一些技術(shù)文章來(lái)和大家分享。
總得來(lái)說(shuō),對(duì)于奇點(diǎn)這樣的微博客戶端,這次對(duì) iOS 11 的適配,改動(dòng)量非常大,以致于我有點(diǎn)不高興。比如 Social 這個(gè) Framework,Apple 居然把所有社交網(wǎng)絡(luò)帳戶分享的功能給去掉了,這使得奇點(diǎn)的「同步到 Twitter」這樣的功能不能再調(diào)用系統(tǒng)的,只能自己重寫。
另外,iOS 11 將 UINavigationBar 的自定義規(guī)范到了嚴(yán)格的程度,如果你有沒(méi)有用 AutoLayout,或者 Custom TitleView 有問(wèn)題,都會(huì)有很多意想不到的問(wèn)題發(fā)生。
這些問(wèn)題解決后,還有 iPhone X 這樣的大問(wèn)題等著我們?nèi)ミm配…
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- 在一個(gè)項(xiàng)目中同時(shí)使用Swift和Objective-C代碼混合編程的方法
- Swift的74個(gè)常用內(nèi)置函數(shù)介紹
- swift中的正則表達(dá)式小結(jié)
- Swift中動(dòng)態(tài)調(diào)用實(shí)例方法介紹
- Swift之UITabBarController 導(dǎo)航控制器的自定義
- Swift教程之枚舉類型詳解
- Swift中的可變參數(shù)函數(shù)介紹
- Swift在控件中添加點(diǎn)擊手勢(shì)的方法
- Swift流程控制之循環(huán)語(yǔ)句和判斷語(yǔ)句詳解
- 分享十條實(shí)用的Swift小提示
相關(guān)文章
用Swift構(gòu)建一個(gè)簡(jiǎn)單的iOS郵件應(yīng)用的方法
這篇文章主要介紹了用Swift構(gòu)建一個(gè)簡(jiǎn)單的iOS郵件應(yīng)用的方法,包括查看和標(biāo)記已讀等基本的郵件應(yīng)用功能,需要的朋友可以參考下2015-07-07
switch實(shí)現(xiàn)一個(gè)兩數(shù)的運(yùn)算代碼示例
這篇文章主要介紹了switch實(shí)現(xiàn)一個(gè)兩數(shù)的運(yùn)算代碼示例,需要的朋友可以參考下2017-06-06
Swift中switch語(yǔ)句區(qū)間和元組模式匹配
這篇文章主要介紹了Swift中switch語(yǔ)句區(qū)間和元組模式匹配的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12
淺談Swift編程中switch與fallthrough語(yǔ)句的使用
這篇文章主要介紹了Swift編程中switch與fallthrough語(yǔ)句的使用,用于基本的流程控制,需要的朋友可以參考下2015-11-11
SwiftUI使用Paths和AnimatableData實(shí)現(xiàn)酷炫的顏色切換動(dòng)畫
這篇文章主要介紹了SwiftUI使用Paths和AnimatableData實(shí)現(xiàn)酷炫的顏色切換動(dòng)畫,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-05-05

