7

我已经查看了大约 10 个关于 SO 的问题,但仍然不足。

我有一个多行 UILabel(在 Interface Builder 中创建,numberOfLines 设置为 0),通常呈现如下:

在此处输入图像描述

我想强调“服务条款”和“隐私政策”,所以我添加了以下代码:

NSString *text = self.agreement.text;
NSMutableAttributedString *aString = [[NSMutableAttributedString alloc] initWithString:text];

NSRange privacyRange = [text rangeOfString:@"privacy policy" options:NSCaseInsensitiveSearch];
[aString addAttribute:NSUnderlineStyleAttributeName value:@(NSUnderlineStyleSingle) range:privacyRange];

NSRange tosRange = [text rangeOfString:@"terms of service" options:NSCaseInsensitiveSearch];
[aString addAttribute:NSUnderlineStyleAttributeName value:@(NSUnderlineStyleSingle) range:tosRange];

self.agreement.attributedText = aString;

但结果如下所示:

在此处输入图像描述

我需要做什么才能显示两条线,并在适当的范围下划线?

此外,我不希望使用 OHAttributedLabel 或 TTTAttributedLabel 之类的第 3 方库,因为这是我的应用程序中唯一需要为一段文本添加下划线的地方。

我试过的

  • sizeToFit设置属性文本后调用
  • 改用 UITextView。两条线都正确渲染,但我失去了中心对齐。
  • 重置numberOfLineslineBreakMode代码

Sascha 让我上传两张背景颜色设置为非清晰的屏幕截图。奇怪的是,一切都按预期显示!不知道该怎么做或这告诉我们什么。

在此处输入图像描述

4

2 回答 2

3
  1. 首先像您一样创建属性文本:

    NSString *text = self.agreement.text;
    NSMutableAttributedString *aString = [[NSMutableAttributedString alloc] initWithString:text];
    
    NSRange privacyRange = [text rangeOfString:@"privacy policy" options:NSCaseInsensitiveSearch];
    [aString addAttribute:NSUnderlineStyleAttributeName value:@(NSUnderlineStyleSingle) range:privacyRange];
    
    NSRange tosRange = [text rangeOfString:@"terms of service" options:NSCaseInsensitiveSearch];
    [aString addAttribute:NSUnderlineStyleAttributeName value:@(NSUnderlineStyleSingle) range:tosRange];
    
  2. 将您要使用的字体分配给属性字符串:

    [aString addAttribute:NSFontAttributeName value:self.agreement.font range:(NSRange){0, aString.length}];
    
    self.agreement.attributedText = aString;
    
  3. 将您的标签定义为多行:

    self.agreement.numberOfLines = 0;
    self.agreement.lineBreakMode = NSLineBreakByWordWrapping;
    
  4. 估计您的标签尺寸:

    CGRect myLabelRect = [aString boundingRectWithSize:CGSizeMake(self.view.frame.size.width, INT_MAX)
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    
  5. 将标签添加到视图时使用估计大小:

    self.agreement.frame = CGRectMake(self.view.frame.size.width / 2 - myLabelRect.size.width / 2,
                                      0,
                                      myLabelRect.size.width,
                                      myLabelRect.size.height);
    [self.view addSubview:self.agreement];
    
于 2014-12-22T10:34:32.693 回答
0

所以昨天,根据 tsafir 的评论(iOS 7 bug,应该在 7.1 中修复),我把这两行分成两个标签,然后继续。

然后,SashaHameister 建议我看看当我应用不清晰的背景颜色时会发生什么。所以我删除了顶部标签,将文本添加到第二个标签,所以它是两行,更改背景颜色,两行都渲染得很好。我认为这就是解决方案(即使它不起作用,因为我需要一个清晰的背景)。

在那之后,我测试了将它改回清除,它仍然对我有用。事实证明,这与我的标签大小有关。我的两行标签的高度约为 75,这对于 11pt 字体的两行标签来说远远超过了必要的高度。由于我昨天所做的调整(将行分成两个标签),当我将第一个标签的文本复制并粘贴到第二个时,高度最终仅为 48px,并且渲染得很好。

我仍然不知道为什么这会产生如此大的影响,但如果您遇到同样的问题,那么您的标签高度可能大于它需要的高度。尝试尽可能减少它,并尽可能紧贴实际文本。

于 2014-03-07T16:30:00.717 回答