【问题标题】:How to change a text color for a certain attributed string or make it bold?如何更改某个属性字符串的文本颜色或使其变为粗体?
【发布时间】:2013-01-30 05:17:32
【问题描述】:

假设我有 NSString * hello = @"hello world";

现在我想要一个属性字符串,其中 hello world 中的地狱用粗体显示。

网络上有一个功能可以做到这一点:

- (NSMutableAttributedString*) word:(NSString*)substringToHighlight{

    NSMutableAttributedString * mutableAttributedString = [[ NSMutableAttributedString alloc]initWithString:self];
    NSUInteger count = 0, length = [mutableAttributedString length];
    NSRange range = NSMakeRange(0, length);

    count = 0,
    length = [mutableAttributedString length];
    range = NSMakeRange(0, length);
    while(range.location != NSNotFound)
    {
        range = [[mutableAttributedString string] rangeOfString:substringToHighlight options:0 range:range];
        if(range.location != NSNotFound) {

            //[mutableAttributedString setTextColor:[UIColor blueColor] range:NSMakeRange(range.location, [word length])];
            range = NSMakeRange(range.location + range.length, length - (range.location + range.length));
            count++;
        }
    }
    return mutableAttributedString;
}

但是,该函数不起作用,因为 mutableAttributedString 不支持 setTextColor

我也试过

NSDictionary * dict = @{kCTFontAttributeName:boldFontName};
        [mutableAttributedString setAttributes:{kCTFontAttributeName:boldFontName} range:NSMakeRange(range.location, substringToHighlight.length)];

但收到消息 kCTFontAttributeName 未定义。

【问题讨论】:

标签: objective-c xcode4.5


【解决方案1】:

您可以使用 rangeOfString:options:range: 或 NSScanner(还有其他可能性,例如正则表达式,但无论如何)。

根据给定的选项,在接收者的给定范围内查找并返回给定字符串的第一次出现的范围。

  • (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask range:(NSRange)aRange

这是另一种解决方案:

那你需要像这样转换成NSMutableAttributedString

NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"hello world"];
NSRange selectedRange = NSMakeRange(0, 4); // 4 characters, starting at index 0

[string beginEditing];

[string addAttribute:NSFontAttributeName
           value:[NSFont fontWithName:@"Helvetica-Bold" size:12.0]
           range:selectedRange];

[string endEditing];

我认为这是最好的解决方案。

【讨论】:

  • 是的。这是只使用一个字符串并且可以以最佳方式使用的好习惯。我喜欢它。
  • 为什么我们需要做 beginEditing 和 endEditing?
  • NSMutableAttributedString 提供/帮助 NSMutableAttributedString 的子类覆盖 beginEditing 和 endEditing 方法。这些方法允许子类的实例记录或缓冲更改组,并在接收到 endEditing 消息时自行清理。 endEditing 方法还允许接收者通知任何观察者它已被更改。例如,NSTextStorage 的 endEditing 实现修复了更改的属性,然后通知其布局管理器他们需要重新布局和重新显示其文本。默认实现什么都不做。
猜你喜欢
  • 1970-01-01
  • 2023-01-30
  • 2018-07-12
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2018-07-15
  • 1970-01-01
相关资源
最近更新 更多