将CGColorRef作为KVC / KVO中的值传递

时间:2011-05-08 20:03:13

标签: iphone quartz-graphics opacity key-value-observing key-value-coding

我正在使用Opacity来生成我的所有Quartz2D艺术品,现在我正在解决通过KVC / KVO改变颜色的问题。 Opacity将其所有颜色变量定义为@dynamic,并将其自己的访问器实现为类定义的一部分。

我的问题是;如何按键值传递新的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 ...

颜色空间和创建代码直接从Opacity的CALayer类生成器中获取(我还没有那么高级)但是传递'color'作为值会导致iPhone模拟器崩溃,而XCode会给我一个非常神秘的警告; < / p>

“不兼容的指针类型将'CGColorRef'(又名struct'CGColor *')发送到'id'类型的参数。”

如何将CGColorRef包装成将其传递到KVC到接收器? 提前谢谢。

3 个答案:

答案 0 :(得分:3)

将CGColorRef转换为(id)有效。以下是将阴影设置为黑色的示例:

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

答案 1 :(得分:2)

我打算建议使用NSValue来包装你的颜色对象,但在测试过程中,我得出的结论是KVO / KVC不适用于CGColors。根据{{​​3}},使用NSValue或NSNumber包装基本类型和结构。但是,在尝试访问CGColorRef属性时,我得到了“不符合KVC”的异常。看起来结构的指针没有像结构本身一样包装到NSValues。这是我的测试代码:

@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包装器。

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

然后,您将在测试台中设置颜色,如下所示:

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

答案 2 :(得分:-3)

错误相当不言自明 - 您需要将CGColorRef转换为(id)。在我的头顶,这应该工作:

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