每次遇到适配的问题都去百度,很浪费时间,所以这里整理下自己的使用以及搜索到的数据,以供下一次自己查看。
适配的屏幕相关数据(非原创,道友分享文章的截图,文章会列举在下方)
代码中目前我使用的与适配相关的宏
#define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)
#define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)
//状态栏的高度
#define kStatusBarHeight [[UIApplication sharedApplication] statusBarFrame].size.height
//导航栏title的高度
#define kNavBarHeight 44.0
//tabBar的高度
#define kTabBarHeight ( Device_Is_iPhoneX_Devices ? 83 : 49)
//状态栏+导航栏的高度
#define kTopBarHeight (kStatusBarHeight + kNavBarHeight)
//判断是否是X系列(很多方法,下面还有无夜之星辰分享的判断方法,使用状态栏高度进行判断)
#define Device_Is_iPhoneX_Devices \
({BOOL isPhoneX = NO;\
if (@available(iOS 11.0, *)) {\
isPhoneX = [[UIApplication sharedApplication] delegate].window.safeAreaInsets.bottom > 0.0;\
}\
(isPhoneX);})
//非X系列没特殊情形时状态栏的高度
#define SYS_STATUSBAR_HEIGHT 20
//热点栏高度
#define HOTSPOT_STATUSBAR_HEIGHT 20
// 根据APP_STATUSBAR_HEIGHT判断是否存在热点栏
#define IS_HOTSPOT_CONNECTED (kStatusBarHeight==(SYS_STATUSBAR_HEIGHT+HOTSPOT_STATUSBAR_HEIGHT) ? YES : NO)
1. X系列机型的判断
- 无夜之星辰分享的 判断是否是iPhoneX系列机型
- iPhoneX系列都是刘海屏,状态栏高度都是44,不管是普通状态下还是特殊状态下(通话中或热点被接入)。
- 其余机型的状态栏高度在常规状态下是20,特殊状态下(通话中或热点被接入)是40。
- 因此“状态栏高度==44”可以作为切入点,判断是否是iPhoneX系列机型的宏如下:
#define iPhoneXSeries (([[UIApplication sharedApplication] statusBarFrame].size.height == 44.0f) ? (YES):(NO))
- 缺点是这个不知道以后的iphone会怎么设计,这个方法是目前可行
- 注意:当隐藏了状态栏的时候状态栏的高度是0,所以根据状态栏判断机型前得先判断状态栏是否被隐藏了。
- 使用安全区域判断
#define Device_Is_iPhoneX_Devices \
({BOOL isPhoneX = NO;\
if (@available(iOS 11.0, *)) {\
isPhoneX = [[UIApplication sharedApplication] delegate].window.safeAreaInsets.bottom > 0.0;\
}\
(isPhoneX);})
2. 全面屏的适配
下面是关于全面屏的尺寸总结的很好
- 安全区域的概念,但是只支持iOS11.0以上,所以需要进行版本判断;
- SafeAreaiOS7以后,苹果给UIViewController引入了topLayoutGuide 和 bottomLayoutGuide两个属性。用于表示顶部或底部的高度。到了iOS11,苹果弃用了topLayoutGuide和bottomLayoutGuide两个属性。引入了safeArea代替。官方的建议是
:不能被遮挡的内容和控件在安全区域范围内显示。如果视图底部有按钮,在全面屏下,请约束底部距离34,不要影响到Home功能。