动态属性文本

时间:2013-06-16 05:43:29

标签: ios ios6

我不确定我的选择是做什么的:

enter image description here

红色文字实际上呈现红色,也是动态的 - 长度会改变。

我应该使用NSAttributedString并找出要应用属性的动态索引和长度吗?

或者是否可以在破折号之前使每个单词成为自己的标签? (我不确定是否可以在内联放置多个标签,并且随着尺寸的增加,每个标签都会向右推,其中有点像在HTML / CSS中的浮动方式)

1 个答案:

答案 0 :(得分:22)

最好的选择肯定是在一个标签中使用一个NSAttributedString执行此操作,因为您的其他选项是:

  1. 使用多个标签,每次更改时更改框架,移动它们,确切地知道空间应该有多宽,确保它们对于屏幕或它们应该在的视图不是太宽等等。正如你所看到的,这很快就会非常痛苦。

  2. 翻过顶部并使用UIWebView,这对于显示单个标签显然有些过分,因为它为您提供了所有这些您不需要的令人惊奇的东西,如滚动和缩放以及JavaScript和东西并且所有这些功能都在使用CPU周期,无论你是否使用它们,所以这绝对不是一个非常好的选择性能,特别是如果你将有大量的这些(例如,表视图中的每个单元格)

  3. 然而,如果你使用单个字符串,你所要做的就是正确计算属性的范围,将属性字符串分配给UILabel的{​​{1}}(注意,仅限iOS 6+,但根据您问题上的标签判断对您来说不是问题),并且您已经完成了。我目前在我的应用程序中广泛使用这种方法,并且它已经运行了一段时间(我做了尝试其他两个之前解决了这个问题,他们都很努力工作)。

    以下是使用属性字符串执行此操作的一个非常基本的示例:

    attributedText

    请注意,如果UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 50, 300, 50)]; label.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:16.0]; [self.view addSubview:label]; NSString *category = @"Socks"; NSString *store = @"Apple Store"; NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat: @"in %@ at %@ — 1 day ago", category, store]]; [string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:[string.string rangeOfString:category]]; [string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:[string.string rangeOfString:store]]; label.attributedText = string; store的值相同,这将无法按预期工作,因为category将找到给定字符串的第一个匹配项,意味着类别字符串可能会突出显示两次,而商店字符串则不会突出显示。

    更好的例子:这是一个稍微高级的例子,由于相同的字符串不会破坏,虽然增加了必须手动计算范围的麻烦:

    rangeOfString:

    这种方式总是正常工作,即使你的所有字符串都相同,但是代码稍微冗长,因为你必须手动计算要突出显示的范围(虽然这不是'这绝对是一个重大问题或许多代码。)

    更新:只需添加一个使用粗体字体的简单示例,这样您就不必查找它了:

    NSString *in = @"in ";
    NSString *category = @"in";
    NSString *at = @" at ";
    NSString *store = @"in";
    
    NSString *text = [NSString stringWithFormat:@"%@%@%@%@ — 1 day ago",
                                                in, category, at, store];
    NSMutableAttributedString *string = [[NSMutableAttributedString alloc]
                                          initWithString:text];
    
    [string addAttribute:NSForegroundColorAttributeName
                   value:[UIColor redColor]
                   range:NSMakeRange(in.length, category.length)];
    [string addAttribute:NSForegroundColorAttributeName
                   value:[UIColor redColor]
                   range:NSMakeRange(in.length + category.length + at.length,
                                     store.length)];
    

    查看NSAttributedString UIKit Additions Reference以了解可以添加到字符串的更多属性,以达到所需的效果。