iOS开发系列-iOS适配
2019-05-23 22:29 iCoderHong 阅读(781) 评论(0) 编辑 收藏 举报概述
发布iPhone X 系统版本为iOS11, 由于刘海屏原因需要对新的机型做适配。
iPhone X
safeArea
iOS11苹果提出safeArea替代iOS7引入 topLayoutGuide 和 bottomLayoutGuide
对于safeArea体现 iOS11增加了新的API
UIView
UIViewController
safeAreaLayoutGuide
UILayoutGuide *safeAreaLayoutGuide父类NSobject,在API看到内部有两个属性,官方文档描述
@property(nonatomic,readonly) CGRect layoutFrame;
@property(nonatomic,weak,nullable) UIView *owningView;
layoutFrame是相对所属UIView的坐标的一块区域。获取最好的时机是在所属UIView的-layoutSubviews方法中
说白了就是View的safeAreaLayoutGuide属性中的layoutFrame属性就是在以当前View的坐标系系统计算得到安全区域,在布局子控件是以这块安全区域为参照布局。避免子控件不能够完全显示的问题。
对于如果使用AutoLayout布局可以这样写:
对于使用Masonry框架布局
可见API添加的UIView的safeAreaLayoutGuide属性用于自动布局参照, 保证所在子控件能够完全显示在父视图中。
safeAreaInsets
UIView的属性safeAreaLayoutGuide中的layouFrame可以认为是根据UIView的safeAreaInsets计算出来的,它表示UIView的安全区域相对当前View的内边距。
与safeAreaLayoutGuide一样获取最好的在UIView的-layoutSubviews方法中
对于控制器和UIView API分别提供了不同的回调方法监听View的safeAreaLayoutGuide改变
适配宏定义
/** 当前系统版本判断 */ #define iOS(version) ([UIDevice currentDevice].systemVersion.doubleValue >= (version)) #define CHScreenW [UIScreen mainScreen].bounds.size.width #define CHScreenH [UIScreen mainScreen].bounds.size.height // 判断是否是刘海屏幕 #define IS_LIUHAI_DEVIVE \ ({\ BOOL INTERFACE_IS_IPHONEX = NO;\ if (@available(iOS 11.0, *)) {\ if([[UIApplication sharedApplication] delegate].window.safeAreaInsets.bottom > 0.0) {\ INTERFACE_IS_IPHONEX = YES;\ }\ }\ INTERFACE_IS_IPHONEX;\ }) // 底部安全区的高度 #define HT_TabbarSafeBottomMargin (IS_LIUHAI_DEVIVE ? 34.f : 0.f)// Status bar & navigation bar height. // 状态栏高度 #define HT_StatusBarHeight (IS_LIUHAI_DEVIVE ? 44.f : 20.f) // 导航栏高度 #define HT_NavigationBarHeight 44.f // TabBar高度 #define HT_TabbarHeight (IS_LIUHAI_DEVIVE ? (49.f+HT_TabbarSafeBottomMargin) : 49.f) // 导航栏&状态栏 #define HT_StatusBarAndNavigationBarHeight (HT_StatusBarHeight + HT_NavigationBarHeight)