自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

iOS開發(fā)·適配iPhone X相關(guān)的宏和方法

移動開發(fā)
過了好久,今天終于有時間總結(jié)一下適配iPhone X相關(guān)的坑,總的來說有兩類坑,一個是導(dǎo)航欄+狀態(tài)欄的高度發(fā)生了變化,一個是一些沒有實現(xiàn)實現(xiàn)-tableView: viewForHeaderInSection:和-tableView: viewForFooterInSection:等代理方法的UITableView會出錯位的問題。

過了好久,今天終于有時間總結(jié)一下適配iPhone X相關(guān)的坑,總的來說有兩類坑,一個是導(dǎo)航欄+狀態(tài)欄的高度發(fā)生了變化,一個是一些沒有實現(xiàn)實現(xiàn)-tableView: viewForHeaderInSection:和-tableView: viewForFooterInSection:等代理方法的UITableView會出錯位的問題。

 

1283539-1f9e771f3c5134b1.png

1. 判斷是否iPhone X:返回YES或NO

1.1 判斷:宏

(1)依據(jù)屏幕分辨率

三目運算法

 

  1. //是否iPhoneX YES:iPhoneX屏幕 NO:傳統(tǒng)屏幕 
  2. #define kIs_iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO

多行邏輯判斷

 

  1. //是否iPhoneX 1:iPhoneX屏幕 0:傳統(tǒng)屏幕 
  2. #define kIs_iPhoneX_test ({\ 
  3. int tmp = 0;\ 
  4. if ([UIScreen instancesRespondToSelector:@selector(currentMode)]) {\ 
  5.     if (CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size)) {\ 
  6.         tmp = 1;\ 
  7.     }else{\ 
  8.         tmp = 0;\ 
  9.     }\ 
  10. }else{\ 
  11.     tmp = 0;\ 
  12. }\ 
  13. tmp;\ 
  14. }) 

其中,反斜杠\并不是注釋或者其它的無用符號,其實是多行宏換行必須要用的標(biāo)志。

***一句tmp;\也是必須的,因為要將經(jīng)過邏輯判斷得到的tmp作為該宏的返回值。

(2)依據(jù)屏幕尺寸

 

  1. #define kIs_iPhoneX (kSCREEN_WIDTH == 375.f && kSCREEN_HEIGHT == 812.f) 
  2. #define kSCREEN_WIDTH  ([UIScreen mainScreen].bounds.size.width) 
  3. #define kSCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height) 

1.2 判斷:方法

方法:依據(jù)設(shè)備型號

 

  1. +(BOOL)getIs_iPhoneX{ 
  2.     struct utsname systemInfo; 
  3.     uname(&systemInfo); 
  4.     NSString *platform = [NSString stringWithCString: systemInfo.machine encoding:NSASCIIStringEncoding]; 
  5.       
  6.     if([platform isEqualToString:@"iPhone10,3"]||[platform isEqualToString:@"iPhone10,6"]) { 
  7.         return YES; 
  8.     }else
  9.         return NO
  10.     } 

2. 靈活返回狀態(tài)欄+導(dǎo)航欄的高度

需求:靈活得到導(dǎo)航欄+狀態(tài)欄的高度,作為一個子視圖Y軸的起點。

宏定義

  1. #define kStatusBarAndNavigationBarHeight (kIs_iPhoneX ? 88.f : 64.f) 

調(diào)用范例

 

  1. //自動適配 
  2. _segmentedControl.frame = CGRectMake(0, kStatusBarAndNavigationBarHeight, kSCREEN_WIDTH, 55); 

3. 拓展:獲得iOS系統(tǒng)與App版本信息

獲取iOS系統(tǒng)版本號:返回字符串

 

  1. + (NSString *)getSystemVersion{ 
  2.     return [[UIDevice currentDevice] systemVersion]; 

獲取App版本號:返回字符串

 

  1. + (NSString *)getAppVersion{ 
  2.     NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary]; 
  3.     // 獲取App的版本號 
  4.     NSString *appVersion = [infoDic objectForKey:@"CFBundleShortVersionString"]; 
  5.     return appVersion; 

4. 適配iPhone X的其他問題

適配iPhone X和Xcode 9的過程中,除了與導(dǎo)航欄相關(guān)的問題,還有一個問題經(jīng)常出現(xiàn),就是UITableView相關(guān)的問題。下面兩個辦法可以解決多數(shù)錯位的問題。

VC創(chuàng)建tableView屬性的時候這樣設(shè)置

 

  1. self.tableView.estimatedRowHeight = 0; 
  2. self.tableView.estimatedSectionHeaderHeight = 0; 
  3. self.tableView.estimatedSectionFooterHeight = 0; 

還可以這樣設(shè)置

 

  1. //cell自適應(yīng)高度 
  2. self.tableView.rowHeight = UITableViewAutomaticDimension; 
  3. //預(yù)估行高 
  4. self.tableView.estimatedRowHeight = 44.0f; 

關(guān)于根視圖的安全區(qū)

iOS新增了個safeArea,原來的老代碼中,規(guī)定子視圖跟根子視圖的關(guān)系的代碼需要新增一個判斷:當(dāng)iOS 11時,需要改為子視圖跟根子視圖的安全區(qū)的關(guān)系。這樣就不會在iPhone X的底部虛擬home有任何控件干擾了。

 

  1. if (@available(iOS 11.0, *)) { 
  2.     make.edges.equalTo(self.view.safeAreaInsets) 
  3. else { 
  4.     make.edges.equalTo(self.view

當(dāng)然,一般除了tabbar不能放在這個底部虛擬home區(qū),其它的視圖tableView視圖或者網(wǎng)頁視圖時可以放在底部虛擬home區(qū)中的。這時候,不需要強調(diào)必須把子視圖放在safeArea之內(nèi),原來的老代碼也就不用改。

責(zé)任編輯:未麗燕 來源: 陳滿iOS
相關(guān)推薦

2013-07-23 07:34:54

iOS開發(fā)學(xué)習(xí)適配iphone5

2017-03-20 15:58:20

iOS開發(fā)常用宏

2017-11-13 16:35:36

iPhone X全面屏APP

2018-07-26 15:16:50

小程序iPhone X甜酸

2011-07-25 15:46:10

iPhone 動態(tài)

2017-12-01 09:57:21

谷歌iPhone X蘋果

2011-07-08 14:58:16

iPhone Xcode iOS

2011-08-22 14:12:48

iPhone開發(fā)NSTableView

2015-07-20 10:54:47

IOS提高效率工具

2011-08-02 13:35:41

iOS開發(fā) Get Post

2011-08-19 13:34:33

iPhone應(yīng)用ABAddressBo

2011-03-16 11:22:16

iconDefaultiPhone

2018-01-05 12:02:46

iPhoneiPhone X蘋果

2021-09-07 10:17:35

iOS多語言適配設(shè)計

2018-01-02 16:08:00

AndroidiOSReact Nativ

2015-02-05 14:31:45

iPhone適配

2017-09-13 09:22:57

iPhone X

2014-02-19 09:59:52

iOS開發(fā)Html解析

2011-05-16 17:19:29

游戲開發(fā)iPhone

2010-03-04 11:01:06

Python開發(fā)環(huán)境
點贊
收藏

51CTO技術(shù)棧公眾號