contentInsetAdjustmentBehavior各個值之間的區別

来源:http://www.cnblogs.com/biosli/archive/2017/11/08/ios-contentInsetAdjustmentBehavior.html
-Advertisement-
Play Games

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系統,而且要詳細看每一個與老系統的對比,優先進行適配。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、讓iOS App通過iTunes進行文件交換Documents 讓iOS App通過iTunes進行文件交換 有一些App需要通過使用iTunes讓用戶上傳和下載文檔。要讓iOS程式支持iTunes文件交換其實很簡單, 只需要在程式的Info.plist里增加一個鍵:UIFileSharingE ...
  • 1. Application does not run in background(鍵名:UIApplicationExistsOnSuspend)自從iOS4.0之後,當你在應用程式執行的時候按下Home鍵,應用程式並不會中斷目前的執行,而是躲到背景去了。因此希望使用者在按下Home鍵之後就要中斷 ...
  • 最近在學習視頻相關的知識,現在也是在按部就班的一步步的來,如果有同樣需求的同學可以跟著大家一起促進學習。 上一節說到了可以使用系統播放器以及瀏覽器播放本地以及網路視頻,但是這在很大程度上並不能滿足我們的需求,幸好,android系統為我們提供了一個很方便的系統API——VideoView,來支持我們 ...
  • http://m.blog.csdn.net/potato512/article/details/51487643 ...
  • (1)什麼是IDFA 關於IDFA,在提交應用到App Store時,iTunes Connect有如下說明: 這裡說到檢查項目中是否包含IDFA,那如何來對iOS項目(包括第三方SDK)檢查是否包含IDFA呢? (2)檢查IDFA的方法: 步驟: 1、打開終端cd到要檢查的文件的根目錄。 2、執行 ...
  • iOS獲取設備唯一標識的各種方法?IDFA、IDFV、UDID分別是什麼含義? [摘要:1、UDID (Unique Device Identifier) UDID的齊稱是Unique Device Identifier,望文生義,它便是蘋果IOS裝備的獨一辨認碼,它由40個字元的字母戰數字構成。正 ...
  • 繼上次解決微軟office Android版Excel下載並打開Excel文件修改後(http://anforen.com/wp/2017/11/excel-android-mobile/),再上傳出現怪問題後。 這次再遇新問題。 上次是改用國產的wps Android版來解決問題的。 (原文首發在 ...
  • 微軟官方的Excel android 移動版,有重大bug。害我折騰了一天多時間。最終確認是Excel自身的問題。 現象描述:手機上新建或是保存excel後。放到電腦上,不能打開。提示”Excel在Book1.xlsx“中發現不可讀取的內容。是否恢復此工作簿的內容?如果信任此工作簿的來源,請單擊”是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...