iOS11也出了不少时候了网上说适配的文章一大堆。
关于contentInsetAdjustmentBehavior这个参数之间的区别,好像没什么人能说明。
往下看的前提是你已经知道什么是安全区域,没看明白这个请出门左转WWDC2017编号204(16分20秒开始)。

以下内容是基于腾讯Bugly的iOS 11 安全区域适配总结内容扩展而来。(原文网址:https://mp.weixin.qq.com/s/W1_0VrchCO50owhJNmJnuQ)

这里写了个Demo目的是解释清楚contentInsetAdjustmentBehavior这个参数的值都是干啥的。
这个Demo的基本原则就是列出所有ScrollView的ContentSize和SaveArea的关系。

 

github地址:

https://github.com/biosli/ScrollViewContentInsetAdjustmentBehaviorDemo

 

基础代码

UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame: self.view.bounds];
scrollView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

UIImage *testImg = [UIImage imageNamed: @"aaaa"];
UIImageView *imageView = [[UIImageView alloc] initWithImage: testImg];

[self.view addSubview: scrollView];

 

简单叙述页面关系:
就是一个ViewController里面放一个ScrollView,ScrollView里面包含了一个UIImageView。aaaa是张大图。

 

一、UIScrollViewContentInsetAdjustmentScrollableAxes

例1:

//以下全部例子,请在iPhoneX模拟器上查看。
//UIScrollViewContentInsetAdjustmentScrollableAxes例1
//如果scrollView的ContentSize很小,则不考虑安全区域
CGRect frame = imageView.frame;
frame.size.width = 300;
frame.size.height = 300;
imageView.frame = frame;
[scrollView addSubview: imageView];

scrollView.contentSize = imageView.frame.size;

scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentScrollableAxes;

例1图:

这两个地方忽略了安全区域。

 

例2:

//UIScrollViewContentInsetAdjustmentScrollableAxes例子2,横屏查看
//如果scrollView的ContentSize大于超出显示范围,则计算安全区域
CGRect frame = imageView.frame;
frame.size.width = 300;
frame.size.height = 600;//图片拉长,超出屏幕范围
imageView.frame = frame;
[scrollView addSubview: imageView];

scrollView.contentSize = imageView.frame.size;

scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentScrollableAxes;

 例2图:

被拉长了,纵向可以滚动,横向宽度不够不能滚动。

红色是横向方向,不可滚动,安全区域被忽略。

 

例3:  

    //UIScrollViewContentInsetAdjustmentScrollableAxes例子3,接上例,横屏查看
    //如果强制横向滚动,则计算安全区域
    CGRect frame = imageView.frame;
    frame.size.width = 300;
    frame.size.height = 600;//图片拉长,超出屏幕范围
    imageView.frame = frame;
    [scrollView addSubview: imageView];
    
    scrollView.contentSize = imageView.frame.size;
    
//强制横向滚动 scrollView.alwaysBounceHorizontal
= YES; scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentScrollableAxes;

例3图:

强制横向滚动,两个方向的安全区域都会被考虑到。

 

二、UIScrollViewContentInsetAdjustmentAutomatic

    //UIScrollViewContentInsetAdjustmentAutomatic例子,横屏查看
    //对照UIScrollViewContentInsetAdjustmentScrollableAxes例1
    //就算不够高度,也会空出上下两部分的安全区域。
    CGRect frame = imageView.frame;
    frame.size.width = 300;
    frame.size.height = 300;
    imageView.frame = frame;
    [scrollView addSubview: imageView];
    
    scrollView.contentSize = imageView.frame.size;
    
    scrollView.contentInsetAdjustmentBehavior =  UIScrollViewContentInsetAdjustmentAutomatic;

例图:

图片很小,不够撑满屏幕,但是用这个参数,会空出上下方向的安全区域。

其他的行为与UIScrollViewContentInsetAdjustmentScrollableAxes一致。

 

三、UIScrollViewContentInsetAdjustmentNever

    //UIScrollViewContentInsetAdjustmentNever例子
    //完全不考虑安全区域
    CGRect frame = imageView.frame;
    frame.size.width = 1000;
    frame.size.height = 1000;
    imageView.frame = frame;
    
    [scrollView addSubview: imageView];
    
    scrollView.contentSize = imageView.frame.size;
    
    scrollView.contentInsetAdjustmentBehavior =  UIScrollViewContentInsetAdjustmentNever;

例图:

Never了就是都不考虑安全区域了。

 

四、UIScrollViewContentInsetAdjustmentAlways

    //UIScrollViewContentInsetAdjustmentAlways例子
    //不管内容,全部考虑安全区域
    CGRect frame = imageView.frame;
    frame.size.width = 300;
    frame.size.height = 300;
    imageView.frame = frame;
    
    [scrollView addSubview: imageView];
    
    scrollView.contentSize = imageView.frame.size;
    
    scrollView.contentInsetAdjustmentBehavior =  UIScrollViewContentInsetAdjustmentAlways;

例图:

不管内容够不够大,全部考虑安全区域。

(对比UIScrollViewContentInsetAdjustmentScrollableAxes例1和UIScrollViewContentInsetAdjustmentAutomatic例子)

 

以下是适配建议:

对于完全自定义页面的安全区域是个碍事的东西,把ScrollView(及子类)的contentInsetAdjustmentBehavior设置成Never,自己控制每一个细节。

对于没有横屏需求的同学,系统默认的UIScrollViewContentInsetAdjustmentAutomatic是个好选择,就不用使用者自己修改了。

对于有横屏需求的同学,建议使用UIScrollViewContentInsetAdjustmentAlways,横屏的时候不会被“刘海”干扰。

 

PS:后面是一些有趣的阴谋论,关于为什么苹果放弃了之前的automaticallyAdjustsScrollViewInsets而强制使用新的SafeArea。

iOS 11是6月WWDC发布的,那时候这个接口(automaticallyAdjustsScrollViewInsets)就被禁掉了。9月份iPhoneX发布。 
当时,大家只知道苹果换了一套布局体系。 
从程序员角度看,6月份大家开始动手适配iOS11,开发人员不明所以,唾弃新体系的种种不便。9月份发布新的屏幕尺寸,新的体系发挥了价值,乖乖听话的开发人员已经适配完成了。 
从苹果角度看,6月份发布了新体系,但并没有透露新体系对新机型出来以后对适配的影响。9月份出新手机了,然后得意的看着开发者“叫你们丫不早适配”。 
这是一个中间组件提供方,强制修改接口的一个好办法。开发人员应该老老实实听苹果粑粑的话趁热适配新的iOS系统,而且要详细看每一个与老系统的对比,优先进行适配。

posted @ 2017-11-08 21:25 摇滚诗人 阅读(7822) 评论(0) 推荐(0) 编辑
摘要: iOS 10.0/ 10.1上的一个bug,会导致苹果推行ATS晚半年? 阅读全文
posted @ 2017-01-08 03:29 摇滚诗人 阅读(1027) 评论(0) 推荐(0) 编辑
摘要: 关于block使用的5点注意事项 阅读全文
posted @ 2015-06-03 10:25 摇滚诗人 阅读(27556) 评论(4) 推荐(1) 编辑
摘要: 函数调用Objective-C是一门动态语言,一个函数是由一个selector(SEL),和一个implement(IML)组成的。Selector相当于门牌号,而Implement才是真正的住户(函数实现)。和现实生活一样,门牌可以随便发(@selector(XXX)),但是不一定都找得到住户,如... 阅读全文
posted @ 2014-04-23 18:49 摇滚诗人 阅读(21800) 评论(1) 推荐(5) 编辑
摘要: 初始化阶段 —— load 和 initializeload函数原型:1 +(void)load当类被引用进程序的时候会执行这个函数。在一个程序开始运行之前(在main函数开始执行之前),在库开始被程序加载,load函数就会开始被执行。我们开发的程序都可以认为是一个库,但是库又不会独立存在(我们的程序还会引用其他库,也可能被其他函数引用),所以库的初始化顺序可以如下:初始化我们引用的库执行我们自己库的Objective-C的load函数执行C++和C的static初始化变量初始化引用我们库的其他库在我们的编写的库中,会有很多类重写load函数,他们之间的执行顺序是不确定的。当父类和子类都实现l 阅读全文
posted @ 2014-04-11 15:30 摇滚诗人 阅读(6478) 评论(0) 推荐(1) 编辑
摘要: 对苹果iOS7中的新的网络接口NSURLSession的功能介绍、使用方法和后台工作流程的分析。 阅读全文
posted @ 2013-10-14 10:40 摇滚诗人 阅读(32449) 评论(8) 推荐(4) 编辑
摘要: 1、block在Objective-C环境下的结构 block是一个“仿”对象 2、block声明的生存期 栈上声明对象是会被回收的,如果要长期持有block对象请把她移到堆上 3、从栈到堆的转换时机 栈上的block什么时候会在执行copy的时候移动到堆上,block可以有三种类型 4、我个人理解的一些设计准则 给调用方一个堆上的,被autorelease的block对象。 5、在ARC下的一些注意事项 过一下strong指针,他好,我也好。 阅读全文
posted @ 2013-05-29 16:45 摇滚诗人 阅读(25690) 评论(7) 推荐(4) 编辑
摘要: 对JsonModel的核心代码做了源码注释,分析,以及一些亮点记录。 阅读全文
posted @ 2013-05-20 20:29 摇滚诗人 阅读(8380) 评论(0) 推荐(2) 编辑
摘要: 1. 名词解释Shards : 每一个shard包括一个或多个服务和存储数据的mongod进程(mongod是MongoDB数据的核心进程)典型的每个shard开启多个服务来提高服务的可用性。这些服务/mongod进程在shard中组成一个复制集Chunks: Chunk是一个来自特殊集合中的一个数据范围,(collection,minKey,maxKey)描叙一个chunk,它介于minKey和maxKey范围之间。例如chunks 的maxsize大小是100M,如果一个文件达到或超过这个范围时,会被切分到2个新的chunks中。当一个shard的数据过量时,chunks将会被迁移到其他的 阅读全文
posted @ 2012-12-30 10:41 摇滚诗人 阅读(4001) 评论(1) 推荐(2) 编辑
摘要: 1. ReplSet源码结构 rs_config.h replSet间同步设置的工具类 rs_member.h 心跳检测类和replSet成员状态的定义 rs_sync.h 同步数据类 rs.h 定义了几乎所有replSet相关的类(Member:replSet中的节点成员, GhostSync:备份同步类,ReplSet:管理所有Member的核心类) 2. ReplSet的结构分析 RSBase定义了线程锁。 ReplSetImpl完... 阅读全文
posted @ 2012-10-19 11:36 摇滚诗人 阅读(4239) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示