代码改变世界

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)