2

我使用Opacity生成所有Quartz2D圖稿,現在我正在解決通過KVC/KVO更改顏色的問題。不透明度將其所有顏色變量定義爲@dynamic,並將其自己的訪問器作爲類定義的一部分。傳遞CGColorRef作爲KVC/KVO中的值

我的問題是;我如何通過鍵值傳遞一個新的CGColorRef值?

到目前爲止(作爲測試平臺),我走了這麼遠:

// Testbed ... Testbed ... Testbed ... Testbed ... Testbed ... Testbed ... Testbed ... 
     CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); 
     CGFloat components[4] = {1.0f, 1.0f, 1.0f, 1.0f}; 
     CGColorRef color = CGColorCreate(space, components); 

     [myCALayerReceiverObject setValue: color forKey: @"numColour"]; 
// Testbed ... Testbed ... Testbed ... Testbed ... Testbed ... Testbed ... Testbed ... 

的色彩空間和創建代碼是直接從透明度的CALayer的類生成解除(我不是說先進又),但通過'顏色'作爲值導致iPhone模擬器崩潰和XCode給我一個非常神祕的警告;

「將'CGColorRef'(又名struct'CGColor *')發送到類型爲'id'的參數的不兼容指針類型」。

如何包裝CGColorRef以將其通過KVC傳遞給接收方? 在此先感謝。

回答

2

我會用NSValue來包裝你的顏色對象建議,但在測試過程中我是來這KVO/KVC不會CGColors工作的結論。根據Key-Value Coding Programming Guide,使用NSValue或NSNumber打包原始類型和結構。但是,當試圖訪問CGColorRef屬性時,我得到「不符合KVC的」異常。看起來,指向結構的指針並不像結構本身一樣包裝到NSValue中。這裏是我的測試代碼:

@interface MyClass : NSObject { 
    CGColorRef color; 
} 
@property (assign) CGColorRef color; 
@end 

@implementation MyClass 
- (CGColorRef)color { return color; } 
- (void)setColor:(CGColorRef)newColor { color = newColor; } 
@end 

int main(int argc, char **argv) { 
    NSAutoreleasePool *p = [NSAutoreleasePool new]; 
    MyClass *theObject = [MyClass new]; 
    CGColorRef theColor = CGColorCreateGenericRGB(1.0,1.0,1.0,1.0); 
    theObject.color = theColor; // works 
    NSLog(@"%@",[theObject valueForKey:@"color"]); // NSValue expected, actually causes exception 
    [p release]; 
    return 0; 
} 

一個可能的解決方法是將一個類添加到它定義了一個不同的密鑰存取正確的類。這些訪問器將是numColour密鑰的NSValue包裝器。

[myCALayerReceiverObject setValue:[NSValue valueWithPointer:(void*)color] forKey:@"numColourKVC"]; 
+0

我剛剛注意到,'CGColorCreateGenericRGB'對於iOS無效,所以我的測試代碼只適用於OS X.顏色來自哪裏並不重要,因爲它不是問題。 – ughoavgfhw 2011-05-08 22:12:45

+0

謝謝你這個ughoavgfhw。自發布這個問題以來,我一直與Opacity進行溝通,並且我的代碼失敗的原因歸結於創建CALayer子類的Opacity邏輯中的一個小缺失。事實上,我原本試圖做的是正確的,不透明度開發人員將在未來發布的產品中解決這個漏洞。謝謝你的幫助。 – VectorVictor 2011-05-09 12:52:58

+0

但CGColor不是標量或結構。它是核心基礎對象 – user102008 2012-05-23 19:08:52

-3

錯誤是不言自明的 - 您需要將CGColorRef作爲(id)。關閉我的頭頂,這應該工作:

[myCALayerReceiverObject setValue: (id)color forKey: @"numColour"]; 
+1

要說錯誤是'不言自明'是沒有用的。這是一種恥辱,因爲你的回答最終是有用的和正確的。 – imnk 2011-12-19 23:09:54

+0

它是如何正確的? CGColorRef不是一個NSObject。 – zrxq 2012-05-27 10:48:40

3

鑄造CGColorRef至(ID)的工作原理:

// in the category 
- (NSValue *)numColourKVC { 
    return [NSValue valueWithPointer:(void*)self.numColour]; 
} 
- (void)setNumColourKVC:(NSValue *)newValue { 
    self.numColour = (CGColorRef)[newValue pointerValue]; 
} 

然後您可以按如下設置顏色在您的測試平臺。下面是一個將陰影設置爲黑色的示例:

[layer setValue:(id)[UIColor blackColor].CGColor forKey:@"shadowColor"]; 
+2

它爲什麼會起作用? – fatuhoku 2014-04-22 23:00:04