如上述要求,我们可以给UILabel 添加一个类别方法,
@interface UILabel (ReadMore)
-(void)setReadMoreLabelContentMode;
@end
#import "UILabel+ReadMore.h"
#import <CoreText/CoreText.h>
@implementation UILabel (ReadMore)
-(void)setReadMoreLabelContentMode
{
? ? NSArray *contents = [self getLinesArrayOfLabelRows];
? ? if (contents.count <= 1) {
? ? ? ? self.userInteractionEnabled = NO; // 如果一行就不显示查看更多,同时取消手势响应
? ? ? ? return;
? ? }
? ? self.userInteractionEnabled=YES;
?? ?
? ? NSUInteger cutLength = 7; // 截取的长度20
?? ?
? ? NSMutableString *contentText = [[NSMutableString alloc] init];
? ? for (NSInteger i = 0; i < self.numberOfLines; i++) {
? ? ? ? if (i == self.numberOfLines - 1) { // 最后一行 进行处理加上.....
?? ? ? ? ? ?
? ? ? ? ? ? NSString *lastLineText = [NSString stringWithFormat:@"%@",contents[i]];
? ? ? ? ? ? NSUInteger lineLength = lastLineText.length;
? ? ? ? ? ? if (lineLength > cutLength) {
? ? ? ? ? ? ? ? lastLineText = [lastLineText substringToIndex:(lastLineText.length - cutLength)];
? ? ? ? ? ? }
? ? ? ? ? ? [contentText appendString:[NSString stringWithFormat:@"%@.....",lastLineText]];
?? ? ? ? ? ?
? ? ? ? } else {
? ? ? ? ? ? [contentText appendString:contents[i]];
? ? ? ? }
? ? }
?? ?
? ? NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
? ? NSDictionary *dictionary = @{
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NSForegroundColorAttributeName : self.textColor,
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NSFontAttributeName : self.font,
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NSParagraphStyleAttributeName : style
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? };
?? ?
? ? NSMutableAttributedString *mutableAttribText = [[NSMutableAttributedString alloc] initWithString:[contentText stringByAppendingString:@"? 更多"] attributes:dictionary];
? ? [mutableAttribText addAttributes:@{
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NSFontAttributeName : [UIFont boldSystemFontOfSize:16.0f],
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NSForegroundColorAttributeName : [UIColor blueColor]
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } range:NSMakeRange(contentText.length, 4)];
? ? self.attributedText = mutableAttribText;
}
// 获取 Label 每行内容 得到一个数组
- (NSArray *)getLinesArrayOfLabelRows
{
? ? CGFloat labelWidth = self.frame.size.width;
?? ?
? ? NSString *text = [self text];
? ? UIFont *font = [self font];
? ? if (text == nil) {
? ? ? ? return nil;
? ? }
? ? CTFontRef myFont = CTFontCreateWithName(( CFStringRef)([font fontName]), [font pointSize], NULL);
? ? NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:text];
? ? NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
? ? paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;
? ? [attStr addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, attStr.length)];
? ? [attStr addAttribute:(NSString *)kCTFontAttributeName
?? ? ? ? ? ? ? ? ? value:(__bridge? id)myFont
?? ? ? ? ? ? ? ? ? range:NSMakeRange(0, attStr.length)];
? ? CFRelease(myFont);
? ? CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString(( CFAttributedStringRef)attStr);
? ? CGMutablePathRef path = CGPathCreateMutable();
? ? CGPathAddRect(path, NULL, CGRectMake(0,0,labelWidth,100000));
? ? CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, NULL);
? ? NSArray *lines = ( NSArray *)CTFrameGetLines(frame);
? ? NSMutableArray *linesArray = [[NSMutableArray alloc]init];
? ? for (id line in lines) {
? ? ? ? CTLineRef lineRef = (__bridge? CTLineRef )line;
? ? ? ? CFRange lineRange = CTLineGetStringRange(lineRef);
? ? ? ? NSRange range = NSMakeRange(lineRange.location, lineRange.length);
? ? ? ? NSString *lineString = [text substringWithRange:range];
? ? ? ? CFAttributedStringSetAttribute((CFMutableAttributedStringRef)attStr,
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lineRange,
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCTKernAttributeName,
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (CFTypeRef)([NSNumber numberWithFloat:0.0]));
? ? ? ? CFAttributedStringSetAttribute((CFMutableAttributedStringRef)attStr,
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lineRange,
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCTKernAttributeName,
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (CFTypeRef)([NSNumber numberWithInt:0.0]));
? ? ? ? [linesArray addObject:lineString];
? ? }
? ? CGPathRelease(path);
? ? CFRelease(frame);
? ? CFRelease(frameSetter);
? ? return (NSArray *)linesArray;
}
@end
调用该方法的的代码:
- (void)viewDidLoad {
? ? [super viewDidLoad];
?? ?
? ? NSString *context = @"当最后一行显示不全时,需求有时候需要改变省略号的位置,系统并未提供,张娜拉邀请我去她家里玩了一会,然后吃饭,看电视动词打次,然后将最后一行文字在指定的地方截断,再拼接省略号";
? ? ? ? NSLog(@" %lu ",(unsigned long)context.length);
?? ? ? ?
? ? ? ? UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10.0f, 60.0f, self.view.frame.size.width - 20.0f, 70.0f)];
? ? ? ? label.font = [UIFont systemFontOfSize:16.0f];
? ? ? ? label.numberOfLines = 3;
? ? ? ? [self.view addSubview:label];
?? ? ? ?
? ? ? ? UITapGestureRecognizer *labelTapGestureRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(labelTouchUpInside)];
? ? ? ? [label addGestureRecognizer:labelTapGestureRecognizer];
?? ? ? ?
? ? ? ? label.text = context;
? ? ? ? [label setReadMoreLabelContentMode];
}
-(void)labelTouchUpInside{
? ? NSLog(@"查看更多");
}