繼上一篇 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。
沒有留言:
張貼留言