问题描述
在 NSAttributedString 类中,有一些函数可以获取某些索引和范围的属性值,但我不确定选择器 attributesAtIndex:effectiveRange 之间的区别和 attributesAtIndex:longestEffectiveRange:inRange: 什么时候使用一个而不是另一个?提前感谢您的任何澄清
In the NSAttributedString class, there are functions that get the values of attributes for certain indices and ranges but I'm unsure of the difference between the selectors attributesAtIndex:effectiveRange and attributesAtIndex:longestEffectiveRange:inRange: and when would I use one instead of the other? Thanks in advance for any clarification
推荐答案
假设你有这样的属性:
范围 [0,2]:黑色背景颜色
范围 [0,2]:粗体
范围 [2,4]:黑色背景颜色
范围 [2,4]:斜体
Let's say you have this kind of attributes:
Range [0,2]: Black Background Color
Range [0,2]: Bold Font
Range [2,4]: Black Background Color
Range [2,4]: Italic Font
如果你记录这个NSAttributedString,它的属性会被分成两部分:
范围 [0,2]:黑色背景颜色和粗体字体
范围 [2,4]:黑色背景颜色和斜体字体
这些属性的作用类似于 NSDictionary,它们在两个范围内有 2 个不同.
If you log this NSAttributedString, its attributes will be separated in two:
Range [0,2]: Black Background Color AND Bold Font
Range [2,4]: Black Background Color AND Italic Font
These attributes works like a NSDictionary, they are 2 different at two ranges.
如果您在索引 0 处为 NSBackgroundColorAttributeName 使用 longestEffectiveRange,您将获得 [0,4] 的范围.
如果你使用 effectiveRange,你会得到 [0,2].
换句话说,longestEffectiveRange 将检查下一个索引(在 effectiveRange 结束之后)是否有另一个属性字典,如果它与它然后附加范围.
If you use longestEffectiveRange at index 0 for NSBackgroundColorAttributeName, you'll get a range of [0,4].
If you use effectiveRange, you'll get [0,2].
In other words, the longestEffectiveRange will check if there is on the next index (after the end of effectiveRange) that may have another dictionary of attributes if it shares the wanted value with it and then append the range.
示例代码:
N**utableAttributedString *attributedString = [[N**utableAttributedString alloc] initWithString:@"BoBiBu"]; [attributedString addAttribute:NSBackgroundColorAttributeName value:[UIColor blackColor] range:N**akeRange(0, 2)]; [attributedString addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:12] range:N**akeRange(0, 2)]; [attributedString addAttribute:NSFontAttributeName value:[UIFont italicSystemFontOfSize:12] range:N**akeRange(2, 2)]; [attributedString addAttribute:NSBackgroundColorAttributeName value:[UIColor blackColor] range:N**akeRange(2, 2)]; NSLog(@"AttributedString: %@", attributedString); NSRange range1; NSLog(@"Attribute: %@", [attributedString attribute:NSBackgroundColorAttributeName atIndex:0 effectiveRange:&range1]); NSLog(@"EffectiveRange of previous attribute: %@", NSStringFromRange(range1)); NSRange range2; NSLog(@"Attribute: %@", [attributedString attribute:NSBackgroundColorAttributeName atIndex:0 longestEffectiveRange:&range2 inRange:N**akeRange(0, 6)]); NSLog(@"Longest effective Range of previous attribute: %@", NSStringFromRange(range2));
日志:
> AttributedString: Bo{ NSBackgroundColor = "UIDeviceWhiteColorSpace 0 1"; NSFont = "<UICTFont: 0x7fd3e2f80ec0> font-family: ".HelveticaNeueInterface-MediumP4"; font-weight: bold; font-style: normal; font-size: 12.00pt"; }Bi{ NSBackgroundColor = "UIDeviceWhiteColorSpace 0 1"; NSFont = "<UICTFont: 0x7fd3e2f83310> font-family: ".HelveticaNeueInterface-Italic"; font-weight: normal; font-style: italic; font-size: 12.00pt"; }Bu{ } > Attribute: UIDeviceWhiteColorSpace 0 1 > EffectiveRange of previous attribute: {0, 2} > Attribute: UIDeviceWhiteColorSpace 0 1 > Longest effective Range of previous attribute: {0, 4}