iOS假装进步

iOS使用宏定义代码块获取状态栏高度

2020-11-16  本文已影响0人  左方
用宏定义代码块写起来最整洁美观,而且易于维护
//状态栏
#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

上一篇下一篇

猜你喜欢

热点阅读