我正在为OSX和iOS编写Core Graphics Cross Plattform Library。
我正在从我创建UIColor CGColor
属性的现有iOS项目中移植它。
当然,Mac上没有UIColor。
那么在两个系统上使用相同颜色的正确方法是什么?
我应该获得以前使用的所有UIColor
的rgb值并以编程方式创建CGColor
,还是应该将代码与TARGET_OS_MAC
和TARGET_OS_IPHONE
ifdefs分开?
答案 0 :(得分:2)
我首选的方法是完全避免使用UIColor
和NSColor
,并尽可能使用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 }
...
}