Converting an NSColor to a UIColor from an NSAttributedString

930 views Asked by At

I am trying to check the colour of specific words in an attributed string. I can access the attribute but can't convert this attribute dictionary into a UIColor.

First I enumerate over my attributed string, this returns, for each different attributed, a dictionary of the attributes. I can then look closer at each.

NSAttributedString * attributes = self.textView.attributedText;

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


}];

When I return the attrs dictionary I get this (with HKWMentionAttributeName being a subclass I am using):

{
    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";
}

I then access the color with attrs[@"NSColor"]; and it is returned as below:

UIExtendedSRGBColorSpace 1 0 0 1

I can't for the life of me figure out how to turn this into a UIColor or even begin to use this object.

I understand that the 1 0 0 1 are the red, green, blue and alpha but I don't know how to access them to use the colorWithRed function.

This link seems to suggest I need to change the color space but it doesn't give much more of an explanation than that.

This link makes me feel that I shouldn't be trying to import the NSColor class as it is an OSX class

I have tried all my usual color go-tos: attempting to load as a CGColor, a CIColor, loading CGColorGetComponents, loading it as an NSString, loading it as an id to see if this would shine more light on the issue.

I feel this is a problem with my understanding of UIColor and NSColor objects but there is very little information I can find which helps convert between the two.

1

There are 1 answers

3
Charles Srstka On BEST ANSWER

@"NSColor", despite coincidentally sharing the name of an AppKit class, is simply the raw value of the NSForegroundColorAttributeName constant. On iOS, this is documented to be a UIColor. Therefore, you should just be able to take attrs[NSForegroundColorAttributeName], cast it to a UIColor, and use it.