如果想看詳細的iOS11變動,可轉到這篇文章觀看。 iOS11 適配
本文是直接寫出了iPhoneX的相關適配
1. 首先是判斷是否為X
這裡我用的方法比較直接,暫時沒碰到什麼bug,如果各位有更好的方法請指教。
多說一句這裡不能用巨集定義
或者在Swift中不要寫成let dzy_ifX: Bool = Screen_H == 812 ? true : false
這樣定義有時候會出問題,大概是因為Screen_H
不同的情況可能會有不同。
let Screen_H = UIScreen.main.bounds.size.height
public var dzy_ifX: Bool {
if Screen_H == 812 {
return true
}else {
return false
}
}
複製程式碼
2. UINavigationBar高度的更改
在老程式碼中,如果是手碼程式設計,相信很多朋友都跟我一樣專案裡面有很多的64
這個數字,我是使用了一個變數來代替這個64
,在全域性找一下所有的64
進行替換
我這個方法並不完善,很明顯在我的專案裡面,我沒有使用到LargeTitle
,如果使用到了LargeTitle
這裡就不是88
和64
了,可以自行修改一下。
public var NaviH: CGFloat {
if Screen_H == 812 {
return 88
}else {
return 64
}
}
複製程式碼
下面的兩張圖都是iOS11之後多出一個Largetitle的
3. UITabbar高度的更改
在iPhoneX中,UITabBar的高度示意圖如下。
其他的手機中,Tabbar
的高度為49
,在iPhoneX中,多了一個圓角矩形區域,高度為34
。
我所有介面的適配就是按著這個TabBar
的樣式來進行適配的。在ViewController
中把最下面留出了一個34
當然了,你也可以根據頁面的具體情況來衡量用不用留這個34
我在所有需要空出這個高度的地方,計算高度的時候都加了一個自定義的變數,如下所示。
public var TabRH: CGFloat {
if Screen_H == 812 {
return 34
}else {
return 0
}
}
複製程式碼
4. automaticallyAdjustsScrollViewInsets屬性的棄用
在iOS11中,該屬性已經被棄用,如果有地方用到了這個,需要進行更改。 不過該屬性是UIViewController的 而替代的contentInsetAdjustmentBehavior屬性為UIScrollView的。 具體怎麼修改可以自行考慮。 我只是簡單的給UIViewController做了一個擴充套件,新增了如下方法。
func dzy_adjustsScrollViewInsets(_ scrollView: UIScrollView? = nil) {
if #available(iOS 11.0, *) {
if let scrollView = scrollView {
scrollView.contentInsetAdjustmentBehavior = .never
}
} else {
automaticallyAdjustsScrollViewInsets = false
}
}
複製程式碼
5. 友情提示,iOS11以後介面中間的線不要使用CollectionView的背景色加間隔來做。
比如我這裡,我是用了0.5
的間隔加灰色背景做的間隔,就會出現類似下圖的問題。
然後我用白色背景,自己在每個cell
裡面加0.5
寬度的線依舊會有這類問題。
大概的原因是cell
的frame
不是一個整數導致的。像這種一行4個cell
,cell
的寬度根據螢幕寬來計算的,不是整數很正常。
在iOS11之前,也會偶爾有類似的問題,比如你可以去搜一下,iOS UILabel字型模糊
,這種關鍵字的文章,講的也都是一個問題。但是在iOS11之後這個問題變得更明顯的,我感受最明顯的就是UICollectionView
中用間隔和背景色劃線的方式。
這種問題我所知道的最簡單的處理方式是,用系統自帶的數學函式,把你的View
或者Cell
的frmae
修改成整數的。類似下面這樣,我使用的是floor
函式 :
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
switch indexPath.section {
case 0:
return CGSize(width: Screen_W, height: UI_H(150))
case 3:
return CGSize(width: Screen_W, height: UI_H(85))
default:
return CGSize(width: floor(Screen_W / 4.0), height: floor(UI_H(75)))
}
}
複製程式碼
如果你對各種數學函式有興趣,可以跳轉我的另一篇文章