2014-09-10 61 views
0

我创建了UILabel.When文本太长时,我希望使用(.. more)替换(...)我已经试过了,但我没有要求结果。如何用(...)替换(...)当文本太长

UILabel * writtenContentLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 0, ScreenWidth - 20 , 70)]; 
writtenContentLabel.numberOfLines = 0; 
writtenContentLabel.text = [str stringByAppendingString:@"More"]; 
writtenContentLabel.lineBreakMode = NSLineBreakByTruncatingMiddle; 
[self addSubview:writtenContentLabel]; 

我该怎么办?

+0

......自我解释是有更多的文字。为什么要添加显式更多? – 2014-09-10 11:17:02

回答

0

您可以使用以下方法:

- (NSString*)stringWithElipsisMore:(NSString*)oringinalStr withLabel:(UILabel*)label 
{ 
    CGRect rect = label.frame; 

    NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; 

    NSDictionary * attributes = @{NSFontAttributeName:label.font, NSParagraphStyleAttributeName:paragraphStyle}; 
    const CGSize maxSize = CGSizeMake(rect.size.width, CGFLOAT_MAX); 
    CGSize stringSize = [oringinalStr boundingRectWithSize:maxSize 
              options:NSStringDrawingUsesLineFragmentOrigin 
             attributes:attributes 
              context:nil].size; 

    if (stringSize.height > rect.size.height) { 
     float proportion = rect.size.height/stringSize.height; 
     NSString *subStr = [oringinalStr substringToIndex:oringinalStr.length * proportion]; 

     CGSize stringSize = [subStr boundingRectWithSize:maxSize 
                options:NSStringDrawingUsesLineFragmentOrigin 
               attributes:attributes 
                context:nil].size; 
     while (stringSize.height < rect.size.height) { 
      subStr = [oringinalStr substringToIndex:subStr.length + 1]; 
      stringSize = [subStr boundingRectWithSize:maxSize 
               options:NSStringDrawingUsesLineFragmentOrigin 
              attributes:attributes 
               context:nil].size; 
     } 

     subStr = [subStr substringToIndex:subStr.length - 1]; 

     while (stringSize.height > rect.size.height){ 
      subStr = [subStr substringToIndex:subStr.length - 1]; 
      stringSize = [subStr boundingRectWithSize:maxSize 
                options:NSStringDrawingUsesLineFragmentOrigin 
                attributes:attributes 
                context:nil].size; 
     } 

     NSRange range = NSMakeRange(subStr.length - 7, 7); 
     NSString *subSubStr = [subStr stringByReplacingCharactersInRange:range withString:@"...more"]; 
     return subSubStr; 
    } else { 
     return oringinalStr; 
    } 
} 


    NSString *subStr = [self stringWithElipsisMore:str withLabel:writtenContentLabel]; 
    writtenContentLabel.text = subStr; 
+0

它也有效。 – soGa 2014-09-12 10:34:36

3

你必须使用一个自定义标签以实现这一目标。

将您的UILabels替换为以下任何自定义标签。他们都支持自定义方法truncationTokenString

可以使用更改默认的省略号,

[label setTruncationTokenString:@"...More"];

+0

谢谢,它的工作。 – soGa 2014-09-10 11:49:06

+0

它目前已被弃用,但我找不到有关我应该使用的文档。有什么建议? – Claus 2015-06-22 15:57:33