7

我不确定执行以下操作的选项是什么:

在此处输入图像描述

红色文本实际上会呈现为红色,并且也是动态的 - 长度会发生变化。

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

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

4

1 回答 1

22

最好的选择绝对是使用单NSAttributedString合一标签来做到这一点,因为您的其他选择是:

  1. 使用多个标签,每次发生变化时更改它们的框架,移动它们,准确计算空间应该有多宽,确保它们对于屏幕或它们应该在的视图来说不会太宽等等。等等。你可以看到,这很快就会变得非常痛苦。

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

而如果您使用单个字符串,您所要做的就是正确计算属性的范围,将属性字符串分配给UILabel's attributedText注意,仅限 iOS 6+,但根据您问题上的标签判断,这对你),你就完成了。我目前在我的应用程序中广泛使用这种方法,并且它运行良好有一段时间了(在确定这个方法之前我确实尝试了其他两种方法,而且它们都很难开始工作)。

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

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)];

即使您的所有字符串都相等,这种方式也始终可以正常工作,但是在代码方面它会稍微冗长一些,因为您必须手动计算要突出显示的范围(尽管这不是一个真正的主要问题或很多代码绝对值)。

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

[string addAttribute:NSFontAttributeName
               value:[UIFont fontWithName:@"HelveticaNeue-Bold" size:16.0]
               range:NSMakeRange(in.length, category.length)];
[string addAttribute:NSFontAttributeName
               value:[UIFont fontWithName:@"HelveticaNeue-Bold" size:16.0]
               range:NSMakeRange(in.length + category.length + at.length,
                                 store.length)];

查看NSAttributedString UIKitAdditions Reference了解更多可以添加到字符串中以实现所需效果的属性。

于 2013-06-16T07:28:35.367 回答