gpt4 book ai didi

ios - 动态属性文本

转载 作者:可可西里 更新时间:2023-11-01 03:25:23 25 4
gpt4 key购买 nike

我不确定执行以下操作时我有哪些选择:

enter image description here

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

我是否应该使用 NSAttributedString 并找出动态索引和长度以应用该属性?

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

最佳答案

最好的选择肯定是在一个标签中使用单个 NSAttributedString 来做到这一点,因为您的其他选择是:

  1. 使用多个标签,每次发生变化时更改它们的框架,四处移动它们,准确计算出空间应该有多宽,确保它们不会太宽以适应屏幕或它们应该在的 View 等等。如您所见,这很快就会变得非常痛苦。

  2. 越过顶部并使用 UIWebView,这对于显示单个标签显然有点矫枉过正,因为它为您提供了所有这些您不需要的惊人功能,例如滚动和缩放以及JavaScript 之类的,所有这些功能都在使用 CPU 周期,不管你是否使用它们,所以这绝对不是一个很好的性能选择,特别是如果你要有大量的这些(例如,在表格 View 中的每个单元格中)

而如果您使用单个字符串,您所要做的就是正确计算属性的范围,将属性字符串分配给 UILabelattributedText (< strong>注意,仅限 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;

请注意,如果 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)];

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

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

[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 UIKit Additions Reference获取更多可以添加到字符串中以实现所需效果的属性。

关于ios - 动态属性文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17130554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com