动态属性文本

The*_*Man 7 ios ios6

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

在此输入图像描述

红色的文本实际上将呈现红色并且也是动态的 - 长度将会改变.

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

或者是否可以在破折号之前将每个单词作为自己的标签?(我不确定是否可以在内联放置多个标签,并且每个标签随着尺寸的增加将其余部分推到右边,有点像在HTML/CSS中如何浮动)

Gre*_*reg 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;
Run Code Online (Sandbox Code Playgroud)

需要注意的是预期,如果这是不行的,例如,价值storecategory是相同的,因为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)];
Run Code Online (Sandbox Code Playgroud)

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

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

[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)];
Run Code Online (Sandbox Code Playgroud)

有关可以添加到字符串以获得所需效果的更多属性,请查看" NSAttributedString UIKit添加参考 ".