用宏定义代码块写起来最整洁美观,而且易于维护
//状态栏
#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即可。
误区一:使用宏定义函数实现
//定义状态栏高度
#define STATUSBAR_HEIGHT \
({\
@available(iOS 13.0, *) ? [[[UIApplication sharedApplication] windows] objectAtIndex:0].windowScene.statusBarManager.statusBarFrame.size.height : [[UIApplication sharedApplication] statusBarFrame].size.height;\
})
这种方法在调用时,与下面这句话一样,都会有iOS 13的⚠️出现
#define STATUSBAR_HEIGHT (@available(iOS 13.0, *)?[UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager.statusBarFrame.size.height:[UIApplication sharedApplication].statusBarFrame.size.height)
误区二:使用预处理指令实现(这样做并不省代码,仅做参考)
预处理指令无法进行代码的判断。只能使用自带的宏定义去判断版本。
网上有些资料介绍,使用__IPHONE_OS_VERSION_MIN_REQUIRED 和__IPHONE_OS_VERSION_MAX_REQUIRED判断。这样是不正确的。
这两句指的是开发支持的最低版本、最高版本。
例如在编译时, 程序最低版本为iOS8, 那么__IPHONE_OS_VERSION_MIN_REQUIRED == 80000
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 90000
// 代码1
[UIView new];
#else
// 代码2, 这里调用了不存在的方法
[UIView 不存在的方法];
#endif
参考资料:
1.iOS 使用宏定义函数和代码块 https://blog.csdn.net/wihatow/article/details/79093395
2.iOS pch中定义使用宏定义函数和代码块 https://www.jianshu.com/p/db218bbfeca9
3.__IPHONE_OS_VERSION_MIN_REQUIRED 和 __IPHONE_OS_VERSION_MAX_ALLOWED https://www.jianshu.com/p/ec295f92992d
网友评论