我正在使用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到接收器? 提前谢谢。
答案 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"];