【问题标题】:How can I change color of part of the text in a NSLocalizedString with Objective C?如何使用 Objective C 更改 NSLocalizedString 中部分文本的颜色?
【发布时间】:2021-10-29 01:53:29
【问题描述】:

这是我的问题。 我有一个 ViewController,其中有一个带有文本的标签,我想更改该句子中某些单词的颜色。 该字符串是一个 NSLocalizedString,它是用不同的语言编写的,并根据用户系统语言而变化。

    self.welcomeMessageLabel.text = NSLocalizedString(@"welcome_message", nil);

这是我想要达到的结果。

如何为部分文本着色?

【问题讨论】:

  • 您可以使用 NSMutableAttributedString 来更改字符串中不同范围的字体大小 BGColor 等属性
  • NSAttrributedString 处理文本中的多种颜色。为了找到哪一个,我建议使用 HTML 代码(然后是 HTML 解析器),或者用标签标记文本,例如 ... un [c]link[/c] all'indirizzo ...,然后解析字符串以着色(也加粗?)

标签: ios objective-c xcode colors nslocalizedstring


【解决方案1】:

NSLocalizedString(@"welcome_message", nil) 返回一个NSString

让我们澄清一下,它只是一个“字符组”,没有粗体/颜色、斜体、偏移等的概念。

并且要以不同的渲染(颜色、粗体等)显示不同的字符,您需要使用NSAttributedString

由于它只是一组字符,因此您需要找出哪些元素需要进行不同的渲染。为此,您可以使用标签,例如 HTML、Markdown、BBCode 标签。

零件示例,我将仅以粗体简化焦点:

//Initial text
...un link all'indirizzo...
// With BBCode tag
...un [b]link[/b] all'indirizzo...
// With HTML tag
...un <b>link</b> all'indirizzo...
// With Markdown tag
...un **link** all'indirizzo...
// With custom tag
...un {link} all'indirizzo...

将该新值放入您的字符串文件中。

如果您使用 HTML,则有一个内置的 init 方法。
查看相关问题:Convert HTML to NSAttributedString in iOS

对于其他的,您可以使用第三方库解析器,也可以自己解析它们。您可以使用NSRegularExpressionNSScanner等...然后将目标效果应用到正确的范围内。

【讨论】:

    【解决方案2】:

    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        _welcomeMessageLabel.attributedText = [self attributedString1];
    }
    
    
    - (NSAttributedString *)attributedString1 {
        NSString *string = @"Ti abbiamo inviato un link all'inndirizzo email che";
        NSString *substring1 = @"link";
        NSString *substring2 = @"email";
        
    //    NSString *string = NSLocalizedString(@"welcome_message", nil);
    //    NSString *substring1 = NSLocalizedString(@"welcome_message_substring1", nil);
    //    NSString *substring2 = NSLocalizedString(@"welcome_message_substring2", nil);
    
    
        NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString: string];
        NSDictionary *attributes = @{NSForegroundColorAttributeName: [UIColor orangeColor]};
        
        [attributedString
         replaceCharactersInRange:[string rangeOfString:substring1]
         withAttributedString:[[NSAttributedString alloc] initWithString: substring1 attributes:attributes]
         ];
        
        [attributedString
         replaceCharactersInRange:[string rangeOfString:substring2]
         withAttributedString:[[NSAttributedString alloc] initWithString: substring2 attributes:attributes]
         ];
        
        return  attributedString;
    }
    
    @end

    【讨论】:

    • 这项工作在这种特殊情况下有效,但例如,“链接”在文本中出现了两次。如果你想给第二个上色,你可能失败了,因为rangeOf: 只返回找到的第一个。
    猜你喜欢
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 2019-02-05
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多