替换iOS 7中UILabel的截断省略号

时间:2014-01-24 12:05:31

标签: ios ios7 uilabel truncation textkit

如何将iOS 7中UILabel的截断省略号(“...”)替换为另一个属性字符?例如,使用彩色“>”。

我希望Text Kit的NSLayoutManager能够实现这一点,但看起来UILabel如果使用它就不会公开它。

另外,我可以安全地假设在每个本地化中使用省略号作为截断字符吗?也许不同的语言有不同的截断字符。

4 个答案:

答案 0 :(得分:2)

我建议你使用TTTAttributedLabel,只需将属性“attributionTruncationToken”设置为自定义字符串。

答案 1 :(得分:0)

我认为它不会让你访问它。我想你会手动处理它。例如,使用TextKit确定字符串的大小,如果它不适合可用区域,请自行截断并添加“>”然后将新字符串放在标签中。

NSAttributedString具有获取字符串大小的方法。

如果您需要更多细节,请告诉我。?

答案 2 :(得分:0)

我认为您可以使用 Fonix 提供的-replaceElipsesForLabel方法进行自定义,以获得所需的结果。

答案 3 :(得分:-1)

我已经编写了一个方法来实现它,并且可以在iOS7中运行

-(void)setCustomEllipsis:(NSString*)customEllipsis inLabel:(UILabel*)label with:(NSString*)string{

//Replace the ellipsis
NSMutableString* result = [[NSMutableString alloc] initWithString:@""];
NSArray* strings = [string componentsSeparatedByString:@" "];
for (NSString* s in strings) {
    CGRect newSize = [[NSString stringWithFormat:@"%@%@%@",result,s,customEllipsis] boundingRectWithSize:CGSizeMake(label.frame.size.width,0) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:label.font} context:nil];
    if (newSize.size.height < label.frame.size.height) {
        [result appendString:s];
        [result appendString:@" "];
    }else{
        [result appendString:customEllipsis];
        break;
    }
}
[label setText:result];

//Set different font to the ellipsis
const CGFloat fontSize = 13;
UIFont *boldFont = [UIFont boldSystemFontOfSize:fontSize];
UIFont *regularFont = [UIFont systemFontOfSize:fontSize];
UIColor *foregroundColor = [UIColor lightGrayColor];

NSDictionary *attrs = [NSDictionary dictionaryWithObjectsAndKeys:regularFont, NSFontAttributeName,foregroundColor, NSForegroundColorAttributeName, nil];
NSDictionary *subAttrs = [NSDictionary dictionaryWithObjectsAndKeys:boldFont, NSFontAttributeName, nil];
const NSRange range = [label.text rangeOfString:customEllipsis];

NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:result
                                           attributes:attrs];
[attributedText setAttributes:subAttrs range:range];


[label setAttributedText:attributedText];
}