用宏定義代碼塊寫起來最整潔美觀,而且易于維護
//狀態(tài)欄
#define STATUSBAR_HEIGHT \
^(){\
if (@available(iOS 13.0, *)) {\
UIStatusBarManager *statusBarManager = [UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager;\
return statusBarManager.statusBarFrame.size.height;\
} else {\
return [UIApplication sharedApplication].statusBarFrame.size.height;\
}\
}()
//底部指示條
#define INDICATOR_HEIGHT \
^(){\
if (@available(iOS 11.0, *)) {\
UIEdgeInsets safeAreaInsets = [[UIApplication sharedApplication] delegate].window.safeAreaInsets;\
return safeAreaInsets.bottom;\
} else {\
return UIEdgeInsetsMake(0, 0, 0, 0).bottom;\
}\
}()
使用的時候調用STATUSBAR_HEIGHT即可。
誤區(qū)一:使用宏定義函數(shù)實現(xiàn)
//定義狀態(tài)欄高度
#define STATUSBAR_HEIGHT \
({\
@available(iOS 13.0, *) ? [[[UIApplication sharedApplication] windows] objectAtIndex:0].windowScene.statusBarManager.statusBarFrame.size.height : [[UIApplication sharedApplication] statusBarFrame].size.height;\
})
這種方法在調用時,與下面這句話一樣,都會有iOS 13的??出現(xiàn)
#define STATUSBAR_HEIGHT (@available(iOS 13.0, *)?[UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager.statusBarFrame.size.height:[UIApplication sharedApplication].statusBarFrame.size.height)
誤區(qū)二:使用預處理指令實現(xiàn)(這樣做并不省代碼,僅做參考)
預處理指令無法進行代碼的判斷。只能使用自帶的宏定義去判斷版本。
網(wǎng)上有些資料介紹,使用__IPHONE_OS_VERSION_MIN_REQUIRED 和__IPHONE_OS_VERSION_MAX_REQUIRED判斷。這樣是不正確的。
這兩句指的是開發(fā)支持的最低版本、最高版本。
例如在編譯時, 程序最低版本為iOS8, 那么__IPHONE_OS_VERSION_MIN_REQUIRED == 80000
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 90000
// 代碼1
[UIView new];
#else
// 代碼2, 這里調用了不存在的方法
[UIView 不存在的方法];
#endif
參考資料:
1.iOS 使用宏定義函數(shù)和代碼塊 https://blog.csdn.net/wihatow/article/details/79093395
2.iOS pch中定義使用宏定義函數(shù)和代碼塊 http://www.itdecent.cn/p/db218bbfeca9
3.__IPHONE_OS_VERSION_MIN_REQUIRED 和 __IPHONE_OS_VERSION_MAX_ALLOWED http://www.itdecent.cn/p/ec295f92992d