如何截断UILabel中字符串中的字符串?

时间:2012-12-16 23:16:00

标签: iphone objective-c ios uikit views

假设我有The Dark Knight Rises at 7:45pm,我需要将其放入固定宽度的UILabel(适用于iPhone)。我怎么能把那个截断物称为“黑暗骑士Ris ......在晚上7:45”,而不是“黑暗骑士在7:4升起......”?

3 个答案:

答案 0 :(得分:11)

UILabel有这个属性:

@property(nonatomic) NSLineBreakMode lineBreakMode;

通过将其设置为NSLineBreakByTruncatingMiddle来启用该行为。

编辑

我不明白你想要截断字符串的一部分。然后阅读:

  

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

示例

所以甚至还有一个用于设置段落样式的类:NSParagraphStyle,它也有可变版本。
因此,假设您有一个要应用该属性的范围:

NSRange range=NSMakeRange(i,j);

你必须创建一个NSMutableParagraphStyle对象,并将它的lineBreakMode设置为NSLineBreakByTruncatingMiddle.Notice,你也可以设置很多其他参数。所以我们这样做:

NSMutableParagraphStyle* style= [NSMutableParagraphStyle new];
style.lineBreakMode= NSLineBreakByTruncatingMiddle;

然后为该范围内的标签的attributionText添加该属性.intribiveText属性是NSAttributedString,而不是NSMutableAttributedString,因此您必须创建NSMutableAttributedString并将其分配给该属性:

NSMutableAttributedString* str=[[NSMutableAttributedString alloc]initWithString: self.label.text];
[str addAttribute: NSParagraphStyleAttributeName value: style range: range];
self.label.attributedText= str;

请注意,NSAttributedString还有很多其他属性,请检查here

答案 1 :(得分:3)

您必须设置lineBreakMode。您可以从Interface Builder或以编程方式执行此操作,如下所示

label.lineBreakMode = NSLineBreakByTruncatingMiddle;

请注意,自iOS 5以来,此类属性的类型已从UILineBreakMode更改为NSLineBreakMode

答案 2 :(得分:3)

我的第一个想法是两个标签并排,两个都有固定的宽度,但我会假设你已经排除了一些未说明的原因。或者,手动计算截断,如下所示......

- (NSString *)truncatedStringFrom:(NSString *)string toFit:(UILabel *)label
                          atPixel:(CGFloat)pixel atPhrase:(NSString *)substring {

    // truncate the part of string before substring until it fits pixel
    // width in label

    NSArray *components = [string componentsSeparatedByString:substring];
    NSString *firstComponent = [components objectAtIndex:0];
    CGSize size = [firstComponent sizeWithFont:label.font];

    NSString *truncatedFirstComponent = firstComponent;

    while (size.width > pixel) {
        firstComponent = [firstComponent substringToIndex:[firstComponent length] - 1];
        truncatedFirstComponent = [firstComponent stringByAppendingString:@"..."];
        size = [truncatedFirstComponent sizeWithFont:label.font];
    }

    NSArray *newComponents = [NSArray arrayWithObjects:truncatedFirstComponent, [components lastObject], nil];
    return [newComponents componentsJoinedByString:substring];
}

这样称呼:

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 160, 21)];
NSString *string = @"The Dark Knight Rises at 7:45pm";
NSString *substring = @"at";
CGFloat pix = 120.0;
NSString *result = [self truncatedStringFrom:string toFit:label atPixel:120.0 atPhrase:@"at"];

label.text = result;

这会产生:@“The Dark Kni ......晚上7:45”