iOS11發佈了不少時候了,好像沒人能說清楚UIScrollView的contentInsetAdjustmentBehavior值的真正含義。 本文以Demo的形式,闡述了contentInsetAdjustmentBehavior值之間的含義對比。 ...
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系統,而且要詳細看每一個與老系統的對比,優先進行適配。