概述

发布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)

iOS开发系列-iOS适配的更多相关文章

  1. iOS开发系列--IOS程序开发概览

    概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的 ...

  2. iOS开发系列-iOS签名机制

    概述 想要了解iOS的签名机制需要有一定密码学有一定的了解.下面依次介绍的数据的加密解密.单向散列函数.数字签名.证书.iOS签名机制. 数据加密解密 在网络通信中想要防止数据被攻击者拦截,我们通常对 ...

  3. iOS开发系列-iOS布局相关

    LayoutSubViews 需要在某个View调整子视图的位置时,可以重写. 以下情况会出发LayoutSubViews方法的调用 init初始化不会触发layoutSubviews,但是是用ini ...

  4. iOS开发系列文章(持续更新……)

    iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...

  5. iOS开发系列--让你的应用“动”起来

    --iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建 ...

  6. iOS开发系列--并行开发其实很容易

    --多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...

  7. iOS开发系列--让你的应用“动”起来

    --iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建 ...

  8. IOS开发系列 --- 核心动画

    原始地址:http://www.cnblogs.com/kenshincui/p/3972100.html 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥i ...

  9. iOS开发系列--让你的应用“动”起来【转载】

    概览 原文链接:http://www.cnblogs.com/kenshincui/p/3972100.html 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥i ...

随机推荐

  1. split("\\s+") 和 split(" +") 有什么区别?

    原文地址:https://blog.csdn.net/it_taojingzhan/article/details/51968993 "hello world, this is Al&quo ...

  2. Java 反射获取私有方法

    通常我们创建一个类时,它的私有方法在类外是不可见的,但是可以通过反射机制来获取调用.具体的反射机制的介绍大家自己百度. 所以反射可能会破坏我们的单例模式,当然解决方案也是有的,就是做个标记记录次数,第 ...

  3. 去除字符串中的HTML标签

    背景:Kindeditor内容保存在数据库中的类型是text,包含文字和HTML标签. 需求:显示内容的前50个字(纯文字内容) 方法:将字段查出去除标签,截取前50 import java.util ...

  4. HTML中改变列表的序号类型

    HTML中,<ol>标签表示有序列表,每一个表项的编号默认从数字开始.比如 <html> <head> <title>test</title> ...

  5. Go学习笔记:Linux下安装Go语言

    CentOS7.6安装Go-1.12.9版本 1. 下载安装包到当前目录下> wget https://dl.google.com/go/go1.12.9.linux-amd64.tar.gz2 ...

  6. JAVA去除抖音视频的水印源码!!!

    @PostMapping("geturl") public DataResponse decodeDouiyin(@RequestBody DouyinRequest req ) ...

  7. 【SQL】ON DUPLICATE KEY UPDATE

    在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新, 在刚碰到的时候,第一反应是将其实现分为两块,分别是判断增加,判断更新,后来发现在mysql中有 ON DUP ...

  8. DELPHI中如何闪烁应用程序窗口或任务栏按钮

    使用FlashWindowEx函数: 一.设置FlashWInfoDelphi中TFlashWInfo申明如下:TypeTFlashWInfo = record cbSize : LongInt; h ...

  9. 码云挂了,无法访问gitee

    解决方式1.修改dns为114.114.114.114 2.hosts文件添加212.64.62.174   gitee.com

  10. js Date.parse() format.

    date format android chrome linux chrome Mobile safari ios chrome windows safari linux firefox window ...