我已经看了〜关于SO的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或TTTAttributedLabel这样的第三方库,因为这是我的应用中唯一需要为一段文字加下划线的地方。
我尝试过什么
sizeToFit
numberOfLines
和lineBreakMode
Sascha让我上传两张截图,背景颜色设置为非透明。奇怪的是,一切都按预期显示!不知道该怎么做或这告诉我们什么。
答案 0 :(得分:2)
首先创建属性文本:
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];
答案 1 :(得分:0)
所以昨天,基于tsafrir的评论(iOS 7错误,应该在7.1中修复),我将两行分成两个标签并继续。
然后,SashaHameister建议我看看当我应用非透明背景颜色时会发生什么。所以我删除了顶部标签,将文本添加到第二个标签,因此它是两行,更改背景颜色,两行都渲染得很好。我认为这是解决方案(即使它不起作用,因为我需要一个清晰的背景)。
之后,我测试了将它更改为清除,它仍然适用于我。事实证明这与我的标签大小有关。我的两行标签的高度约为75,比11pt字体的双行标签要多。由于我昨天所做的调整(将线条分成两个标签),当我将第一个标签的文本复制并粘贴到第二个标签时,高度最终只有48px,并且渲染得很好。
我仍然不知道为什么会产生这样的影响,但是如果你遇到同样的问题,那么你的标签高度可能比它需要的大。尝试尽可能地减少它,并尽可能地将其与实际文本紧密相关。