scrollView滾動原理

来源:https://www.cnblogs.com/ganchuanpu/archive/2018/03/23/8633769.html
-Advertisement-
Play Games

首先要明確的是,scrollview 其實和普通的 view 並沒有多大的差別,只不過給它加上了一些手勢和約定。 我們知道,要讓一個 scrollview 能夠滾動的方法是設置它的 contentSize 的寬或者高或者同時比自己的 frame 大。 想一想為什麼要這樣做? 首先,scrollvie ...


首先要明確的是,scrollview 其實和普通的 view 並沒有多大的差別,只不過給它加上了一些手勢和約定。

我們知道,要讓一個 scrollview 能夠滾動的方法是設置它的 contentSize 的寬或者高或者同時比自己的 frame 大。

想一想為什麼要這樣做?

首先,scrollview 被蘋果開發出來是為了通過滾動來顯示比自己的 size 更多的內容,如果它的 contentSize 比自己都小,就沒有滾動的必要了。

但實際上,scrollview 並沒有滾動,當你在“拖動” scrollview 時,你其實是在改變 scrollview 的 bounds.origin。

那麼什麼是 bounds 呢? bounds 和 frame 又有什麼關係呢?

bounds 是一個 view 自身的坐標系,它的作用是規定它自身的內容從什麼位置開始繪製。 frame 是一個 view 相對於自己父視圖的位置。它們是完全不相關聯的。

你已經知道的是,當你“拖動” scrollview 時, scrollview 的代理會收到scrollViewDidScroll: 的消息,在裡面列印 scrollview 的 contentOffset 的值,這個值會隨著你的“拖動”不停的變化。這時候,嘗試列印一下 scrollview 的 bounds.origin 的值,你會發現,這個值竟然和前面的值一樣。contentOffset 只是為了更好的說明情況給 bounds.origin 換了個名字而已。

contentSize 只是抽象的概念,它規定的其實是 scrollview 的 bounds.origin 能夠變化的範圍。

理解到這裡,像其他的 scrollview 的特性,例如 bounces 等,都可以得到解釋。

scrollview 還增加了一個特性,contentInset,它用來 scrollview 增加額外的滾動範圍,其實就是把 bounds.origin 的變化範圍擴大了。當你給 scrollview 設置 contentInset 的時候,你會發現,它的 contentSize 並沒有改變。

一般情況下,你並不會通過直接設置 contentSize 來達到你“滾動”的目的,因為當你想讓 scrollview 的所有內容都能夠通過“滾動”的方式顯示時,你很難計運算元視圖整體的大小, 因為子視圖在當時有可能還沒決定自己的大小。所以通常來說,你會用 scrollview 的子類,例如 tableview 和 textview。他們會根據自己內容的大小自動的設置 scrollview 的 contentSize,以便包裹所有內容。當然他們有自己不同的使用場景。

同樣,當我們試圖實現類似的功能時,我們該怎麼做呢?

這裡我們會用到 Auto layout。只要 scrollview 的子視圖確定了自己的大小,那麼 scrollview 的 contentSize 就確定了,scrollable area 也就確定了。

這裡的最佳實踐是首先在 scrollview 上添加一個四周的 edge constraints 與 scrollview 間距為0的 content view,接下來,把你想要的子視圖添加上去並且設置好相應的約束就可以了。

當我們實現上面的功能後,如果我們還想通過增加一些額外的滾動空間來實現例如防止鍵盤遮擋視圖、下拉刷新或者上拉載入的功能時,我們就可以通過簡單的設置 scroll view 的 contentInset 來實現,而不必從一開始就去關心 contentSize 的大小。

問題思考:scrollView 的代理有 scrollViewDidScrollToTop: 的方法來通知 scrollView 滑動到了頂部,想一想它的原理是什麼?如何知道 scrollView 滑動到底部了呢?如果還要加上考慮 contentOffset 和 contentInset 呢?


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

-Advertisement-
Play Games
更多相關文章
  • 1、概述 Nginx是一款開源的,高性能的Http和反向代理伺服器,同時也是一個IMAP、POP3、SMTP代理伺服器;Nginx可以作為一個HTTP伺服器進行網站的發佈處理,也可以作為反向代理進行負載均衡的實現。 2、反向代理和正向代理 所謂代理其實可以理解為一個代表或者一個渠道,如房產中介,他被 ...
  • 實現目標:一年12個月,每個月插入一條數據,score為1 5的隨機數 迴圈語句: WHILE …… DO …… END WHILE 迴圈語句: LOOP……END LOOP DELIMITER ; CREATE PROCEDURE test_insert() BEGIN DECLARE y TIN ...
  • 1.shell腳本的方式 index_re.sh sqlplus / as sysdba <<EOFspool /tmp/i.sql repselect 'alter index '||owner||'."'||index_name||'" rebuild;' from dba_indexes wh ...
  • 這幾天有業務部門需要使用一個SAP B1老系統 中的報表,但是由於此報表沒有加時間條件,導致一旦開始查詢 就會導致B1系統異常退出。由於報表對應的SQL 是存在資料庫中,所以想通過查找到這個報表的SQL,然後給SQL加時間條件的方式來處理(多年前的一個報表,不知道內部邏輯,很難重寫)。 但是苦於不清 ...
  • 經過開發和測試環境部署 現在到了我們動手的時候了,萬事開頭難,首先我們實現個小功能 今天我們準備實現這樣一個功能:數據永遠也不會被DELETE掉 ...
  • 一、複製原理 MongoDB的複製功能是使用操作日誌oplog實現的,oplog包含主節點(Master)的每一次寫操作,oplog是local本地資料庫中的一個數據集合,其它非主節點(Secondary)通過讀取主節點的oplog集合中的記錄同步到對應的集合,然後再寫入到自身的local資料庫的o ...
  • 目的 描述鎖定機制以及Oracle如何管理數據併發處理 監視和解決鎖定衝突 鎖 -可防止多個會話同時更改同一數據 -是在指定語句的最低可能級別自動獲取的 -不會升級 事務處理可以鎖定單個數據行,多個數據行,甚至整個表。Oracle DB支持手動鎖定和自動鎖定。自動獲取的鎖總是選擇儘可能低的鎖定級別, ...
  • Oracle資料庫被劃分為稱作表空間的邏輯區域,形成Oracle資料庫的邏輯結構。一個Oracle資料庫對應一個或多個表空間,而一個表空間對應一個或多個物理的資料庫文件。表空間是Oracle資料庫回覆的最小單位,容納著許多資料庫實體,如表、視圖、索引、聚簇、回退段和臨時段等。Oracle資料庫會創建 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...