適配iPhoneX常用的巨集定義及方法
過了好久,今天終於有時間總結一下適配iPhone X相關的坑,總的來說有兩類坑,一個是導航欄+狀態列的高度發生了變化,一個是一些沒有實現實現-tableView: viewForHeaderInSection:和-tableView: viewForFooterInSection:等代理方法的UITableView會出錯位的問題。
1. 判斷是否iPhone X:返回YES或NO
1.1 判斷:巨集
(1)依據螢幕解析度
-
三目運演算法
1 2 |
//是否iPhoneX YES:iPhoneX螢幕 NO:傳統螢幕 #define kIs_iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake( 1125 , 2436 ), [[UIScreen mainScreen] currentMode].size) : NO)
|
-
多行邏輯判斷
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//是否iPhoneX 1:iPhoneX螢幕 0:傳統螢幕 #define kIs_iPhoneX_test ({\
int tmp = 0 ;\
if ([UIScreen instancesRespondToSelector:@selector(currentMode)]) {\
if (CGSizeEqualToSize(CGSizeMake( 1125 , 2436 ), [[UIScreen mainScreen] currentMode].size)) {\
tmp = 1 ;\
} else {\
tmp = 0 ;\
}\
} else {\
tmp = 0 ;\
}\
tmp;\
}) |
其中,反斜槓\並不是註釋或者其它的無用符號,其實是多行巨集換行必須要用的標誌。
最後一句tmp;\也是必須的,因為要將經過邏輯判斷得到的tmp作為該巨集的返回值。
(2)依據螢幕尺寸
1 2 3 |
#define kIs_iPhoneX (kSCREEN_WIDTH == 375 .f && kSCREEN_HEIGHT == 812 .f)
#define kSCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)
#define kSCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)
|
1.2 判斷:方法
-
方法:依據裝置型號