在iOS和OSX之间共享CGColor

时间:2014-04-15 22:22:26

标签: ios objective-c macos core-graphics

我正在为OSX和iOS编写Core Graphics Cross Plattform Library。

我正在从我创建UIColor CGColor属性的现有iOS项目中移植它。 当然,Mac上没有UIColor。

那么在两个系统上使用相同颜色的正确方法是什么? 我应该获得以前使用的所有UIColor的rgb值并以编程方式创建CGColor,还是应该将代码与TARGET_OS_MACTARGET_OS_IPHONE ifdefs分开?

3 个答案:

答案 0 :(得分:2)

我首选的方法是完全避免使用UIColorNSColor,并尽可能使用CGColorRef

核心动画是在iOS和OS X上绘制的最佳/最现代的方式。它需要CGColorRef个对象,并且(非常)跨平台。

唯一的缺点是,作为较低级别的数据类型,ARC不会为您处理内存管理。但手动内存管理并不难。

CGColorRef的用法:

CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
CGFloat componennts[4] = {255, 255, 255, 255}; // white, with 100% opacity. Use {0,0,0,255} for black, or {255,0,0,127.5} for red with 50% opacity.
CGColorRef color = CGColorCreate(colorSpace, componennts);
CGColorSpaceRelease(space);

layer.backgroundColor = color; // layer is a CALayer object
CGColorRelease(color);

您可以通过将颜色空间对象存储在静态变量中来避免创建/释放颜色空间对象:

static CGColorSpaceRef colorSpace;

@implementation MyClass

+ (void)initialize
{
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    colorSpace = CGColorSpaceCreateDeviceRGB();
  });
}

- (void)blah
{
    CGFloat componennts[4] = {255, 255, 255, 255}; // white, with 100% opacity. Use {0,0,0,255} for black, or {255,0,0,127.5} for red with 50% opacity.
    CGColorRef color = CGColorCreate(space, componennts);

    layer.backgroundColor = color; // layer is a CALayer object
    CGColorRelease(color);

答案 1 :(得分:1)

我认为你应该这样做:

#ifndef UIColor
#define UIColor NSColor
#endif

答案 2 :(得分:0)

如何在macOS上创建别名

#if canImport(UIKit)
    import UIKit
#elseif canImport(AppKit)
    import AppKit

    public typealias UIColor = NSColor
#endif

public protocol Theme {
    var tint: UIColor { get }
    ...
}