UILabel:仅将行换行模式应用于文本的一部分

时间:2013-10-07 18:30:38

标签: iphone ios cocoa-touch

考虑一个长串,例如“位于美丽的巴尔的摩市中心”。

我的标签对于此文字来说太小了,目前显示如下:

Located in beautiful downtown Ba…

我希望位置子字符串被中心截断而不截断“位于”子字符串,如下所示:

  

位于美丽的... ltimore City

UILabel class reference表明这应该是可能的:

  

如果要将换行模式仅应用于文本的一部分,请使用所需的样式信息创建新的属性字符串,并将其与标签关联。如果未使用样式化文本,则此属性将应用于text属性中的整个文本字符串。

在一个示例项目中,只有一个UILabel,我尝试使用以下代码来遵循这些说明:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *firstPart = @"Located in";
    NSString *secondPart = @"beautiful downtown Baltimore City";
    NSString *joined = [NSString stringWithFormat:@"%@ %@", firstPart, secondPart];

    NSMutableAttributedString *joinedAttributed = [[NSMutableAttributedString alloc] initWithString:joined];

    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
    style.lineBreakMode = NSLineBreakByTruncatingMiddle;

    NSRange detailRange = [joined rangeOfString:secondPart];

    [joinedAttributed addAttribute:NSParagraphStyleAttributeName value:style range:detailRange];

    self.label.attributedText = joinedAttributed;
}

我的标签仍然显示相同,最后截断。

以下是调试器中的最终结果:

(lldb) po joinedAttributed
Located in {
}beautiful downtown Baltimore City{
    NSParagraphStyle = "Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 5, Tabs (\n    28L,\n    56L,\n    84L,\n    112L,\n    140L,\n    168L,\n    196L,\n    224L,\n    252L,\n    280L,\n    308L,\n    336L\n), DefaultTabInterval 0, Blocks (null), Lists (null), BaseWritingDirection -1, HyphenationFactor 0, TighteningFactor 0, HeaderLevel 0";
}

有没有人让这个工作?我的实施中缺少什么?

1 个答案:

答案 0 :(得分:0)

为什么不使用两个UILabel?第一个包含文本“位于”,然后第二个包含您想要的任何其他文本。然后,您只能将NSLineBreakByTruncatingMiddle属性应用于第二个标签。 你只需将它们彼此相邻放置就可以产生同样UILabel的错觉。

希望这有帮助!