【问题标题】:Share CGColor between iOS and OSX在 iOS 和 OSX 之间共享 CGColor
【发布时间】:2014-05-30 12:15:51
【问题描述】:

我正在为 OSX 和 iOS 编写一个核心图形跨平台库。

我将它从我创建UIColor CGColorattribute 的现有iOS 项目中移植过来。 当然 UIColor 在 mac 上是不可用的。

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

【问题讨论】:

    标签: ios objective-c macos core-graphics


    【解决方案1】:

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

    Core Animation 是在 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);
    

    【讨论】:

    • 你有CGColorRef的示例用法
    【解决方案2】:

    我认为你应该这样做:

    #ifndef UIColor
    #define UIColor NSColor
    #endif
    

    【讨论】:

    • 这不起作用,因为 NSColor 没有 CGColor 属性
    • 将它添加到一个类别中!
    • @vikingosegundo 聪明——一开始没想到
    • 我不会将它添加到类别中。 OS X 10.10 beta 1 可能会在 WWDC 上发布,并且很有可能拥有 iOS 上存在的方法,并且您的类别可能会以不可预知的方式破坏事情。相反,如果你想走这条路,我会创建一个编译器宏。
    • @arnoapp:从 10.8 开始,它确实(确实)!
    【解决方案3】:

    如何在 macOS 上创建别名

    #if canImport(UIKit)
        import UIKit
    #elseif canImport(AppKit)
        import AppKit
    
        public typealias UIColor = NSColor
    #endif
    
    public protocol Theme {
        var tint: UIColor { get }
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2015-11-26
      • 2018-06-04
      • 2015-01-15
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 2012-09-09
      • 1970-01-01
      相关资源
      最近更新 更多