檢視:重繪與 UIScrollView

weixin_34120274發表於2016-04-08

當使用者觸控檢視時,檢視會收到 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: 訊息,最後繪製。

以文字框輸入為例,示意圖如下:


147260-a9bf88ad31e50afd.png
檢視在執行迴圈中重繪自己

iOS SDK 中提供的檢視物件會自動在顯示內容發生改變時向自身傳送 setNeedsDisplay 訊息,例如 UILabel。而自定義的 UIView 子類,則需手動向其傳送 setNeedsDisplay 訊息,示例程式碼如下:

- (void)setCircleColor:(UIColor *)circleColor {
    _circleColor = circleColor;
    [self setNeedsDisplay];
}

這樣再點選檢視就可以看到顏色變化了。如圖:


147260-7d0b6dd21fdb9842.png
顏色變了
  • 類擴充套件

BNRHypnosisView.m 檔案的頂部 (@implementation 之前 ) 新增的這三行程式碼,如下:

@interface BNRHypnosisView ()
@property (strong, nonatomic) UIColor *circleColor;
@end

稱為 BNRHypnosisView 的類擴充套件。

作用:宣告只在類的內部使用的屬性和方法。可以保持標頭檔案簡潔,避免內部實現細節的暴露。

  • UIScrollView

UIScrollViewUIView 的子類,也可以使用 initWithFrame: 訊息初始化,還可以作為子檢視新增到其他檢視。

新增 UIScrollView 後的檢視結構如圖所示:

147260-505c258807184aaf.png
加入 UIScrollView 後的檢視層次結構

設定分頁:

[scrollView setPagingEnabled:YES]; //分頁顯示

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


147260-3ca05401400b561b.png
未設定分頁效果

分頁實現原理:
UIScrollView 物件會根據其 bounds 的尺寸將 contentSize 分割成多個尺寸相同的區域。拖動結束後,UIScrollView 例項會自動滾到並顯示其中一個區域。

程式碼地址:
https://github.com/Ranch2014/iOSProgramming4ed/tree/master/05-RedrawingAndUIScrollView/Hypnosister

《iOS程式設計(第4版)》 筆記

相關文章