檢視:重繪與 UIScrollView
當使用者觸控檢視時,檢視會收到 touchesBegan:withEvent:
訊息,該訊息用來處理觸控事件。
產生一個隨機的 UIColor
物件,示例程式碼:
// 獲取三個0到1之間的數字
float red = (arc4random() % 100) / 100.0;
float green = (arc4random() % 100) / 100.0;
float blue = (arc4random() % 100) / 100.0;
UIColor *randomColor = [UIColor colorWithRed:red
green:green
blue:blue
alpha:1.0];
self.circleColor = randomColor;
- 執行迴圈和重繪檢視
iOS 應用啟動時會開始一個執行迴圈 (run loop) 。執行迴圈的工作是監聽事件,例如觸控。當事件發生時,執行迴圈會為相應的事件找到合適的處理方法,這些處理方法會呼叫其他方法,以此類推。只有當這些方法都執行完,控制權才會再次回到執行迴圈。
此時,執行迴圈首先會檢查是否有等待重繪的檢視(即收到過
setNeedsDisplay
訊息的檢視),然後向所有等待重繪的檢視傳送drawRect:
訊息,最後繪製。
以文字框輸入為例,示意圖如下:

iOS SDK 中提供的檢視物件會自動在顯示內容發生改變時向自身傳送 setNeedsDisplay
訊息,例如 UILabel
。而自定義的 UIView
子類,則需手動向其傳送 setNeedsDisplay
訊息,示例程式碼如下:
- (void)setCircleColor:(UIColor *)circleColor {
_circleColor = circleColor;
[self setNeedsDisplay];
}
這樣再點選檢視就可以看到顏色變化了。如圖:

- 類擴充套件
在 BNRHypnosisView.m
檔案的頂部 (@implementation
之前 ) 新增的這三行程式碼,如下:
@interface BNRHypnosisView ()
@property (strong, nonatomic) UIColor *circleColor;
@end
稱為 BNRHypnosisView
的類擴充套件。
作用:宣告只在類的內部使用的屬性和方法。可以保持標頭檔案簡潔,避免內部實現細節的暴露。
- UIScrollView
UIScrollView
是 UIView
的子類,也可以使用 initWithFrame:
訊息初始化,還可以作為子檢視新增到其他檢視。
新增 UIScrollView
後的檢視結構如圖所示:

設定分頁:
[scrollView setPagingEnabled:YES]; //分頁顯示
若不設定分頁,如果有多個物件時,可能出現如下效果(即螢幕同時顯示多個檢視的一部分):

分頁實現原理:
UIScrollView
物件會根據其bounds
的尺寸將contentSize
分割成多個尺寸相同的區域。拖動結束後,UIScrollView
例項會自動滾到並顯示其中一個區域。
程式碼地址:
https://github.com/Ranch2014/iOSProgramming4ed/tree/master/05-RedrawingAndUIScrollView/Hypnosister
相關文章
- UIScrollView視覺差動畫UIView視覺動畫
- 迴流 與 重繪
- 迴流(reflow)與重繪(repaint)AI
- UIScrollView AutoLayoutUIView
- Python繪圖與視覺化Python繪圖視覺化
- flutter: 視窗初始與繪製流程Flutter
- 你應該要知道的重繪與重排
- 4.2.8 檢視元件的Oracle重啟配置元件Oracle
- 資料檢視的重複問題
- 安卓學習筆記31:使用自定義檢視繪製文字、圖形與影像安卓筆記
- 重排和重繪
- 關於迴流與重繪優化的探索優化
- 瀏覽器的迴流與重繪 (Reflow & Repaint)瀏覽器AI
- CSS新特性contain,控制頁面的重繪與重排CSSAI
- iOS開發-檢視與檢視控制器生命週期iOS
- MySQL檢視簡介與操作MySql
- Linux 中檢視 DNS 與 配置LinuxDNS
- docker 容器的使用與檢視Docker
- 前端優化,瞭解瀏覽器重排與重繪前端優化瀏覽器
- 高效能JavaScript 重排與重繪 讀書筆記JavaScript筆記
- 前端迴流與重繪:概念及觸發條件前端
- iOS 重繪之drawRectiOS
- 如何快速檢視Linux系統重啟情況Linux
- 【asp.net core 系列】3 檢視以及檢視與控制器ASP.NET
- iOS探索:UI檢視之卡頓、掉幀及繪製原理iOSUI
- 畫圖板的重繪
- iOS學習筆記02 UIScrollViewiOS筆記UIView
- 11 UML中的邏輯檢視、程序檢視、實現檢視、部署檢視
- 你需要了解下Android View的更新requestLayout與重繪invalidateAndroidView
- 【高效能JS】重繪、重排與瀏覽器優化方法JS瀏覽器優化
- [Django REST framework - 檢視元件之檢視基類、檢視擴充套件類、檢視子類、檢視集]DjangoRESTFramework元件套件
- flutter: 根檢視、根元素與根渲染Flutter
- oracle 統計資訊檢視與收集Oracle
- MySQL--儲存過程與檢視MySql儲存過程
- 迴流、重繪及其優化優化
- JS的重繪和迴流JS
- 三種UIScrollView巢狀實現方案UIView巢狀
- 前端效能優化:細說瀏覽器渲染的重排與重繪前端優化瀏覽器
- 介紹迴流與重繪(Reflow & Repaint),以及如何進行優化?AI優化