UILabel 粗体/突出显示所有出现的子字符串

Posted

技术标签:

【中文标题】UILabel 粗体/突出显示所有出现的子字符串【英文标题】:UILabel Bold / Highlight All occurrences SubString 【发布时间】:2014-05-06 13:27:06 【问题描述】:

我在自定义表格单元格中有多个 UILabel。这些标签包含不同的文本或不同的长度。

就目前而言,我有 UILabel 子类,允许我实现这些方法

- (void)boldRange:(NSRange)range 
if (![self respondsToSelector:@selector(setAttributedText:)]) 
    return;

NSMutableAttributedString *attributedText;
if (!self.attributedText) 
    attributedText = [[NSMutableAttributedString alloc] initWithString:self.text];
 else 
    attributedText = [[NSMutableAttributedString alloc]initWithAttributedString:self.attributedText];

     [attributedText setAttributes:@NSFontAttributeName:[UIFont boldSystemFontOfSize:self.font.pointSize] range:range];
self.attributedText = attributedText;
NSLog(@"%@", NSStringFromRange(range));


- (void)boldSubstring:(NSString*)substring 
    NSRange range = [self.text rangeOfString:substring];
    [self boldRange:range];

这让我可以调用[cell.StoryLabel boldSubstring:@"test"];,这将BOLD第一次出现“test”这个词。

我追求的是能够创建新的子类方法或扩展我已经拥有的方法,以允许我替换标签中指定单词的所有出现。

我研究了许多方法,包括 3rd 方框架。我遇到的麻烦是这对我来说是一个学习过程。我自己尝试完成这项工作对我来说会更有益。

提前致谢!

【问题讨论】:

rangeOfString 返回第一次出现,这是正常行为。您可以使用NSRegularExpression,并使用matchesInString:options:range 获得NSArrayNSRange,使用for 循环将其加粗。 我如何将[attributedText setAttributes: 设置为多个? ioscreator.com/tutorials/format-text-in-ios6-attributed-strings ***.com/questions/18365631/… @Macrosoft-Dev : 问题不在于多粗(将“效果添加到NSAttributedString”),而在于如何找到子字符串... 【参考方案1】:

rangeOfString 返回第一次出现,这是正常行为。 来自Doc:

查找并返回给定字符串第一次出现的范围 在接收器内。

您可以使用NSRegularExpression,并使用matchesInString:options:range 获得NSTextCheckingResultNSArray(具有NSRange 属性),然后使用for loop 将其加粗。

这应该可以解决问题:

- (void)boldSubstring:(NSString*)substring

    if (![self respondsToSelector:@selector(setAttributedText:)])
    
        return;
    

    NSError *error;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern: substring options:NSRegularExpressionCaseInsensitive error:&error];

    if (!error)
    
        NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:[self text]];
        NSArray *allMatches = [regex matchesInString:[self text] options:0 range:NSMakeRange(0, [[self text] length])];
        for (NSTextCheckingResult *aMatch in allMatches)
        
            NSRange matchRange = [aMatch range];
            [attributedString setAttributes:@NSFontAttributeName:[UIFont boldSystemFontOfSize:self.font.pointSize] range: matchRange];
        
        [self setAttributedText:attributedString];
    

【讨论】:

我实现了你的方法,但它似乎不起作用。我要突出显示的文本仍然与其他文本相同 我搞定了。我之前忘记了一行(将属性文本设置为self),你添加了吗? 我不确定,你说的是哪一行? 我添加了:[self setAttributedText:attributedString];。如果error 不为空,请检查调试。还要检查 [allMatches count] 在调试器中是否不同于 0。

以上是关于UILabel 粗体/突出显示所有出现的子字符串的主要内容,如果未能解决你的问题,请参考以下文章

求字符串不同子串个数

如何在 UILabel 上仅突出显示触摸文本的背景

字符串子串去重之后的个数

仅替换具有类突出显示 javascript 的子字符串

SwiftUI:是不是存在修饰符来突出显示 Text() 视图的子字符串?

在 UIAlertView 中突出显示单词? (用粗体字)