我在现有的 NSAttributedString 没有 kCTFontAttributeName 范围:

[attributedString enumerateAttribute:(NSString *) kCTFontAttributeName
                             inRange:NSMakeRange(0, [attributedString length])
                             options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
                          usingBlock:^(id value, NSRange range, BOOL *stop) {
    NSLog(@"Attribute: %@, %@", value, NSStringFromRange(range));
}];

我得到以下输出,但我希望没有输出。建议?

Attribute: (null), {0, 27}
Attribute: (null), {27, 1}
Attribute: (null), {28, 1}
Attribute: (null), {29, 1}
Attribute: (null), {30, 1}
有帮助吗?

解决方案

简短的答案? -enumerateAttribute:inRange:options:usingBlock: 不做您(或我最初)认为的事情。

从名称中,您可能会假设 只要 列举包含给定属性的接收器的范围。不是这种情况。它 总是 枚举 全部的 细绳。它调用块 每个 运行它会遇到。这 value 传递到块中的设置为该运行的给定属性的值。如果当前运行不包含给定属性,则通过 nil 为了 value.

因此,对于不包含给定属性的字符串,它仍然会发射块,但是 value 将一直是 nil. 。对于完全由给定属性覆盖的字符串(具有相同的值),您希望块一次发射一次 value 在字符串中等于该属性的值。对于由给定属性部分覆盖的字符串,您希望该块发射多次,有时用一个 valuenil, ,有时有一个 value 等于属性。

希望有帮助。我花了一段时间从正确的方向看它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top