iOS UILabel 添加查看更多

參考鏈接
參考鏈接

效果
  • UILabel + ReadMore 分類
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface UILabel (ReadMore)

-(void)setReadMoreLabelContentMode;

@end

NS_ASSUME_NONNULL_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 = 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:14.0f],
                                       NSForegroundColorAttributeName : [UIColor orangeColor]
                                       } range:NSMakeRange(contentText.length, 6)];
    self.attributedText = mutableAttribText;
}

// 獲取 Label 每行內(nèi)容 得到一個數(shù)組
- (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
  • 例子
NSString *context = @"當最后一行顯示不全時,需求有時候需要改變省略號的位置为迈,系統(tǒng)并未提供缺菌,但我們可以通過coreText拿到每行的文字,然后將最后一行文字在指定的地方截斷伴郁,再拼接省略號";
    NSLog(@" %lu ",(unsigned long)context.length);
    
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10.0f, 60.0f, self.view.frame.size.width - 20.0f, 50.0f)];
    label.font = [UIFont systemFontOfSize:14.0f];
    label.numberOfLines = 2;
    [self.view addSubview:label];
    
    UITapGestureRecognizer *labelTapGestureRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(labelTouchUpInside)];
    [label addGestureRecognizer:labelTapGestureRecognizer];
    
    label.text = context;
    [label setReadMoreLabelContentMode];
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末焊傅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子狐胎,更是在濱河造成了極大的恐慌,老刑警劉巖晕鹊,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晓锻,居然都是意外死亡飞几,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門躁锁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绪钥,“玉大人关炼,你說我怎么就攤上這事程腹。” “怎么了儒拂?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵寸潦,是天一觀的道長。 經(jīng)常有香客問我社痛,道長见转,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任蒜哀,我火速辦了婚禮斩箫,結果婚禮上,老公的妹妹穿的比我還像新娘撵儿。我一直安慰自己乘客,他們只是感情好,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布淀歇。 她就那樣靜靜地躺著,像睡著了一般浪默。 火紅的嫁衣襯著肌膚如雪牡直。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天纳决,我揣著相機與錄音碰逸,去河邊找鬼。 笑死阔加,一個胖子當著我的面吹牛饵史,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼约急,長吁一口氣:“原來是場噩夢啊……” “哼零远!你這毒婦竟也來了?” 一聲冷哼從身側響起厌蔽,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤牵辣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奴饮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纬向,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年戴卜,在試婚紗的時候發(fā)現(xiàn)自己被綠了逾条。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡投剥,死狀恐怖师脂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情江锨,我是刑警寧澤吃警,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站啄育,受9級特大地震影響酌心,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挑豌,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一安券、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧氓英,春花似錦侯勉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至饰迹,卻和暖如春芳誓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背啊鸭。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工锹淌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赠制。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓赂摆,卻偏偏與公主長得像挟憔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子烟号,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351