Ios 多行UILabel上的NSAttribute字符串切断第一行

Ios 多行UILabel上的NSAttribute字符串切断第一行,ios,objective-c,uilabel,nsattributedstring,nsmutableattributedstring,Ios,Objective C,Uilabel,Nsattributedstring,Nsmutableattributedstring,我已经看了大约10个问题,但仍然有不足之处 我有一个多行UILabel(在Interface Builder中创建,numberOfLines设置为0),通常呈现如下: 我想强调“服务条款”和“隐私政策”,因此我添加了以下代码: NSString *text = self.agreement.text; NSMutableAttributedString *aString = [[NSMutableAttributedString alloc] initWithString:text]; N

我已经看了大约10个问题,但仍然有不足之处

我有一个多行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或TTtatAttributedLabel这样的第三方库,因为这是我应用程序中唯一需要在文本下面划线的地方

我尝试过的

  • 设置属性文本后调用
    sizeToFit
  • 改为使用UITextView。两条线都正确渲染,但我失去了中心对齐
  • 重置代码中的
    numberOfLines
    lineBreakMode
Sascha让我上传两张背景颜色设置为非清晰的截图。奇怪的是,一切都如预期的那样出现了!不知道该怎么做,也不知道这告诉了我们什么


所以昨天,根据tsafrir的评论(iOS 7 bug,应该在7.1中修复),我将这两行代码分成两个标签,然后继续前进

然后,SashaHameister建议我看看当我应用不清晰的背景色时会发生什么。因此,我删除了顶部标签,将文本添加到第二个标签,使其为两行,更改背景颜色,两行都呈现良好。我认为这就是解决办法(尽管它不起作用,因为我需要一个清晰的背景)

在那之后,我试着把它改回clear,它仍然对我有效。结果发现这和我的标签的大小有关。我的两行标签的高度约为75,比11pt字体的两行标签所需的高度高出很多。由于我昨天做的调整(将线条分成两个标签),当我复制并粘贴第一个标签的文本到第二个标签时,高度仅为48px,渲染效果很好

我仍然不知道为什么这会产生如此大的影响,但是如果你有同样的问题,很可能你的标签的高度比它需要的大。试着尽可能地减少它,并使它尽可能紧密地贴在实际文本上

  • 首先创建属性化文本,如下所示:

    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];
    
  • 为属性字符串指定要使用的字体:

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

    self.agreement.numberOfLines = 0;
    self.agreement.lineBreakMode = NSLineBreakByWordWrapping;
    
  • 估计您的标签大小:

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

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

  • 出于测试目的,给标签一个看起来大于必要的高度。第一行是否仍被剪裁?如果我在IB中调整高度,则在运行应用程序时,整个标签将消失。如果我在
    viewdiload
    中的代码中调整标签的框架,我只会得到一行带有两个下划线的区域。所有这些奇怪的行为只有在您加下划线时才会发生?由于Apple bug(我在上看到了,所以它应该在7.1上修复),我建议现在您只使用两个单独的UILabel,这将是最快的解决方案。我也在上面浪费了很多时间。@bilobatum,奇怪的是,如果我将属性字符串设置为不同的颜色而不是下划线,那么一切都会很好地显示出来。如果一个是颜色,一个是下划线,我只看到一行文本。根据沙弗里尔的建议,也许我只需要使用两个标签,或者换一个颜色而不是下划线。这似乎是一个布局问题。你没有使用自动布局?我目前正努力解决几乎完全相同的问题。我试着调整标签的大小,确信第一行现在已经呈现出来了。多么奇怪的行为!不过,调整大小并不是一个完美的解决方案。UILabel位于
    UITableViewCell
    中。每个单元格都包含唯一的数据。例如,如果我有一个3行的UILabel,我可以调整它的大小,使所有3行都显示出来,但如果我表格中的下一个单元格只有两行文字,第一行将被截断……我花了几个小时尝试解决问题,然后放弃了。我刚刚将UILabel更改为UIExtView,并禁用了编辑和选择功能。像冠军一样工作