CodeV

1.8-UIKit和Quartz的颜色属性

许多Core Foundation类具有UIKit等效项,反之亦然。通常这些是无损桥接的,这意味着Core Foundation风格的数据类型可以与UIKit版本互换使用。使用ARC桥接调用(__bridge)在Core Foundation风格版本和UIKit版本之间转换。

UIKit中的大多数绘图例程和类都是围绕Quartz函数和Core Graphics对象的Objective-C包装替代项。UIColor里面有一个CGColor。UIBezierPath实例内部包括CGPath。UIImage包装CGImage或CIImage。然而,这些包装器不是等效的对象。 虽然你可以很容易地访问支持的Quartz元素,但是它们不能桥接。

在UIKit中,UIColor类表示颜色和不透明度值。你可以通过使用各种方法创建它们,但最常见的方法是向类提供RGB值(colorWithRed:green:blue:alpha :)或HSV值(colorWithHue:saturation:brightness:alpha :)。

当使用Core Graphics时,你会发现自己需要在UIKit和Quartz之间来回移动。为了解决这个问题,每个UIColor提供一个CGColor属性。此属性提供与实例的颜色和alpha值对应的Quartz CGColorRef类型的颜色。

您可以使用此属性向Quartz提供符合条件的参数。例如,下面的代码行:

1
CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor);

这个函数是调用一个Quartz例程设置上下文的填充颜色。其中第二个参数使用UIColor标准的绿色中获取,它的CGColor属性提供了一个表示Quartz 2D绘图颜色的类型,它可以安全地用于Core Graphics函数。

在从UIKit包装中分离或引用Quartz颜色时要格外小心。您可能需要手动保留该颜色,以使其生命周期超出其父级的范围。许多开发中的内存问题已经被ARC的内存管理捕获,遇到释放内存错误的情况大多是是传递一个不再指向
有效的实例的CGColorRef变量。Big Nerd Ranch的Mark Dalrymple在http://blog.bignerdranch.com/296-arc-gotcha-unexpectedly-short-lifetimes 中讨论了这个问题。

要从Quartz返回到UIKit,请使用类构造函数方法。这将从Core Graphics对象引用构建一个UIKit实例:

1
UIColor *color = [UIColor colorWithCGColor:myCGColorRef];

Note

使用UIColor实例的CGColor属性时要小心。ARC可能会假定您在将CGColor分配给变量后不再使用UIKit颜色,这可能引发异常。即使您是从UIKit对象中提取的CGColor也要始终保留和释放分配给变量的Core Graphics属性。


本文翻译自《iOS Drawing Practical UIKit Solutions》作者:Erica Sadun,翻译:Cheng Dong。如果觉得本书不错请购买支持正版:亚马逊购买传送门,本书所有源代码可在GitHub上下载。译者虽然力求做到信,达,雅,但是由于时间仓促加之译者水平十分有限,文中难免会出现不正确,不准确,词不达意,难于理解的地方,还望各位批评指正,共同进步,谢谢。转载请注明出处。