如何截断UILabel中的string中的string?

假设我The Dark Knight Rises at 7:45pmThe Dark Knight Rises at 7:45pm我需要把它变成一个固定宽度的UILabel(iPhone版)。 我将如何使截断为“黑暗骑士Ris …在晚上7:45”而不是“黑暗骑士在7:4上升”?

UILabel有这个属性:

 @property(nonatomic) NSLineBreakMode lineBreakMode; 

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

编辑

我不明白你只想截断一部分string。然后阅读:

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

所以甚至有一个设置段落样式的类:NSParagraphStyle,它也是可变的版本。
所以我们假设你有一个你想要应用这个属性的范围:

 NSRange range=NSMakeRange(i,j); 

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

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

然后为该范围内的标签的属性文本添加该属性。属性文本属性是一个NSAttributedString,而不是一个NSMutableAttributedString,所以您将不得不创build一个NSMutableAttributedString并将其分配给该属性:

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

请注意,NSAttributedString还有很多其他属性,请查看这里 。

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

 label.lineBreakMode = NSLineBreakByTruncatingMiddle; 

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

我的第一个想法是两个标签并排固定宽度,但我会认为你已经排除了一些未说明的理由。 或者,手动计算截断,像这样…

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

这产生:@“黑暗的Kni …在7:45 pm”