en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

4.19.2011

UIView 底色色彩即時變換(二)

繼上一篇 UIView 底色色彩即時變換(一)中,介紹了使用 Core Graphic 的方式設定 UIView subclass 之後,這次將利用 Key - Value Observing 的方式來執行色彩變換。Key - Value Observing 主要是觀察特定物件的 property 的數值是否改變,當該 property 數值改變時,將執行對應的動作。應用到的方法有二種,第一是 addObserver: forKeyPath: options:context:,第二是 observeValueForKeyPath: ofObject:change: context: 。

同樣是在 UIView subclass 中做設定,但是在設定前請先將原先在 drawRect 方法中的 code 去除,並且在 viewcontroller 中方法 updateColorView 裡的 setNeedsDisplay 方法去除,也就是不利用 Core Graphic 方式更新畫布。接下來單純只在 UIView subclass 中做 Key - Value Observing 的設定。相關 XIB 檔案設定,IBAction 及 IBOutlet 的連結請參考上一篇 UIView 底色色彩即時變換(一)

在UIView subclass 中,啟用 awakeFromNib 方法,其設定如下:

-(void)awakeFromNib {
    self.backgroundColor = [UIColor colorWithRed:redFloat green:greenFloat blue:blueFloat alpha:1];

    // 設定觀察者以及欲觀察的 property
    [self addObserver:self forKeyPath:@"redFloat" options:0 context:NULL];
}

上述 code 中,使用 awakeFromNib 方法是因為我們的 UIView 是設定在 XIB 檔案中,因此當 UIView 被載入後,需要做額外的設定就必須在 awakeFromNib 方法中做設定。一開始先設定 UIView subclass 的初始背景顏色,因為一開始沒有指定數值,所以 subclass 一開始會是黑色的,若是沒有這一行 code ,那初始的背景顏色就會是各位在 XIB 檔案中設定好的背景色。接下來,我們設定欲觀察的數值為 redFloat。當 redFloat 被指定新的數值的時候,就會引用 observeValueForKeyPath:ofObject:change:context: 。

所以接下來設定 observeValueForKeyPath:ofObject:change:context: 方法。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change
    context:(void *)context {

    self.backgroundColor = [UIColor colorWithRed:redFloat green:greenFloat blue:blueFloat alpha:1];
}

以上方法中我們再做一次 backgroundColor 的設定,因為在 viewcontroller 中 updateColorView 方法裡,每次執行該方法時,都會重新設定 redFloat, greenFloat ,blueFloat 的數值,因此當 observeValueForKeyPath:ofObject:change:context: 被呼叫時,就會將三個 R G B 數值重新給 backgroundColor 作為新的色彩設定。如此,同樣可以達到與使用 Core Graphic 同樣的效果。


關於Key - Value Observing 的相關文件請參考 Apple 的 Key-Value Observing Programming Guide






沒有留言:

張貼留言