将 NSColor 从 NSAttributedString 转换为 UIColor

Posted

技术标签:

【中文标题】将 NSColor 从 NSAttributedString 转换为 UIColor【英文标题】:Converting an NSColor to a UIColor from an NSAttributedString 【发布时间】:2017-09-14 01:57:35 【问题描述】:

我正在尝试检查属性字符串中特定单词的颜色。我可以访问该属性,但无法将此属性字典转换为 UIColor。

首先我枚举我的属性字符串,这会为每个不同的属性返回一个属性字典。然后我可以仔细观察每一个。

NSAttributedString * attributes = self.textView.attributedText;

[attributes enumerateAttributesInRange:NSMakeRange(0, attributes.length) options:0 usingBlock:^(NSDictionary<NSString *,id> * _Nonnull attrs, NSRange range, BOOL * _Nonnull stop) 


];

当我返回 attrs 字典时,我得到了这个(HKWMentionAttributeName 是我正在使用的子类):


    HKWMentionAttributeName = "<0x610000243450> (HKWMentionsAttribute) text: ABC name 1, id: uY5Vv8QzBxhPoB8jTxUBeBmTaeD3, no range";
    NSColor = "UIExtendedSRGBColorSpace 1 0 0 1";
    NSFont = "<UICTFont: 0x7fd388558ce0> font-family: \".SFUIText\"; font-weight: normal; font-style: normal; font-size: 19.00pt";

然后我使用attrs[@"NSColor"]; 访问颜色,返回如下:

UIExtendedSRGBColorSpace 1 0 0 1

我这辈子都不知道如何把它变成 UIColor 甚至开始使用这个对象。

我知道1 0 0 1 是红色、绿色、蓝色和alpha,但我不知道如何访问它们以使用colorWithRed 函数。

This link 似乎暗示我需要更改色彩空间,但它并没有给出更多的解释。

This link 让我觉得我不应该尝试导入 NSColor 类,因为它是一个 OSX 类

我已经尝试了所有常用的颜色选择:尝试加载为CGColorCIColor、加载CGColorGetComponents、加载为NSString、加载为id 以查看如果这能更清楚地说明这个问题。

我觉得这是我对 UIColorNSColor 对象的理解的问题,但我能找到的信息很少能帮助在两者之间进行转换。

【问题讨论】:

你确定这个对象实际上是一个NSColor吗?这看起来很奇怪,因为人们会期望 NSColor 不会出现在 ios 上。如果你运行NSLog(@"%@", NSStringFromClass([attrs[@"NSColor"] class]));,你会得到什么? 当我这样做时,它说它是UICachedDeviceRGBColor 这就是我所期望的。一分钟。 错误说明了一切。更改色彩空间。 @ElTomato 如何更改色彩空间?我已经搜索过这个(在发布之前),除了提供的链接之外找不到任何其他内容,该链接没有提供有关如何操作的任何详细信息。 【参考方案1】:

@"NSColor" 尽管巧合地共享了一个 AppKit 类的名称,但它只是 NSForegroundColorAttributeName 常量的原始值。在 iOS 上,这被记录为 UIColor。因此,您应该能够将attrs[NSForegroundColorAttributeName] 转换为UIColor,然后使用它。

【讨论】:

我认为这是一个滑坡。你怎么知道它们共享完全相同的色彩空间? @ElTomato 没有“坡度”。 OP 在查看字符串名称时是错误的。这个 .foregroundColor. @ElTomato 这里没有什么奇怪的。只需:UIColor *color = attrs[NSForegroundColorAttributeName];。就是这样。完成。

以上是关于将 NSColor 从 NSAttributedString 转换为 UIColor的主要内容,如果未能解决你的问题,请参考以下文章

将使用 colorWithPatternImage 创建的 NSColor 转换为 CGColor?

以编程方式从10.11中的资产目录中获取颜色?

NSColor 及其色调组件

Objective-C 在 NSUserDefaults 中保存 NSColor

如何为正确的构建系统自动选择 NSColor 和 UIColor? (使用#define,或其他东西)

在 NSView 中添加边框和圆角矩形