多线UILabel上的NSAttributedString切断第一线

时间:2014-03-06 22:50:44

标签: ios objective-c uilabel nsattributedstring nsmutableattributedstring

我已经看了〜关于SO的10个问题,但我仍然很短暂。

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

enter image description here

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

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;

但结果如下:

enter image description here

我需要做什么才能显示这两行,并用适当的范围加下划线?

此外,我不想使用像OHAttributedLabel或TTTAttributedLabel这样的第三方库,因为这是我的应用中唯一需要为一段文字加下划线的地方。

我尝试过什么

  • 在设置归因文字后调用sizeToFit
  • 使用UITextView代替。两条线都正确渲染但我失去了中心对齐。
  • 重置代码
  • 中的numberOfLineslineBreakMode

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

enter image description here

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

所以昨天,基于tsafrir的评论(iOS 7错误,应该在7.1中修复),我将两行分成两个标签并继续。

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

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

我仍然不知道为什么会产生这样的影响,但是如果你遇到同样的问题,那么你的标签高度可能比它需要的大。尝试尽可能地减少它,并尽可能地将其与实际文本紧密相关。