将 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 类
我已经尝试了所有常用的颜色选择:尝试加载为CGColor
、CIColor
、加载CGColorGetComponents
、加载为NSString
、加载为id
以查看如果这能更清楚地说明这个问题。
我觉得这是我对 UIColor
和 NSColor
对象的理解的问题,但我能找到的信息很少能帮助在两者之间进行转换。
【问题讨论】:
你确定这个对象实际上是一个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?
Objective-C 在 NSUserDefaults 中保存 NSColor