YYLabel使用查看更多,特殊处理逻辑

111 阅读1分钟

文字结尾一直存在一个查看更多的按钮,当文字超出限制时使用...+按钮,不超出限制行数时显示:按钮

`///处理内容

    TSBaseYYLabel *yyLabel = (TSBaseYYLabel *)self.contentLabel;

    yyLabel.numberOfLines = 11;

    yyLabel.userInteractionEnabled = YES;

    // 配置段落样式

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];

    paragraphStyle.lineSpacing = 0;

    paragraphStyle.minimumLineHeight = 24;

    paragraphStyle.maximumLineHeight = 24;

//    paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;

    // 创建文本属性

    NSDictionary *contentAttributes = @{

        NSFontAttributeName: kFontSysRegular(16),

        NSForegroundColorAttributeName: yyLabel.textColor,

        NSParagraphStyleAttributeName: paragraphStyle

    };

    // 初始化主文本

    NSMutableAttributedString *mainText = [[NSMutableAttributedString alloc] initWithString:model.summery attributes:contentAttributes];

    // 构建截断标识 (... + 图标)

    NSMutableAttributedString *truncationToken = [[NSMutableAttributedString alloc] initWithString:@" ..." attributes:contentAttributes];

    // 创建可点击图标(先只有添加按钮好用)

    UIButton * fullArticalBtn = [UIButton buttonWithImage:@"nav_share_white_16" target:self action: @selector(fullArticleBtnClick)];

    fullArticalBtn.frame = CGRectMake(0, 0, 20, 16);

    [fullArticalBtn setContentHorizontalAlignment:UIControlContentHorizontalAlignmentRight];

    NSMutableAttributedString * imageAtt = [NSMutableAttributedString yy_attachmentStringWithContent:fullArticalBtn contentMode:UIViewContentModeScaleAspectFit attachmentSize:CGSizeMake(20, 16) alignToFont:kFontSysRegular(16) alignment:YYTextVerticalAlignmentCenter];

    [truncationToken appendAttributedString:imageAtt];

    // 先判断主文本是否超出 11 行

    BOOL isOriginalTruncated = [self isTextTruncated:mainText maxLines:11 width:SCREEN_WIDTH - 32];

    if (isOriginalTruncated) {

        // 如果原文就超行

        yyLabel.truncationToken = truncationToken;

        yyLabel.attributedText = mainText;

    } else {

         //不超行时,追加空格 + 图标

        NSMutableAttributedString *fullText = [mainText mutableCopy];

        NSMutableAttributedString *imageIcon = [imageAtt mutableCopy];

        [fullText appendAttributedString:imageIcon];

        // 再次判断是否超行

        if ([self isTextTruncated:fullText maxLines:11 width:SCREEN_WIDTH - 32]) {

            yyLabel.truncationToken = truncationToken;

            yyLabel.attributedText = mainText;

        } else {

            yyLabel.attributedText = fullText;

        }

    }

//判断是否超出,判断两个位置更严谨
- (**BOOL**)isTextTruncated:(NSAttributedString *)text

              maxLines:(NSUInteger)maxLines

                 width:(CGFloat)width {

    // 1. 创建容器并限制最大行数

    YYTextContainer *container = [YYTextContainer containerWithSize:CGSizeMake(width, CGFLOAT_MAX)];

    container.maximumNumberOfRows = maxLines;

    container.truncationType = YYTextTruncationTypeEnd;

    // 2. 生成布局

    YYTextLayout *layout = [YYTextLayout layoutWithContainer:container text:text];

    // 3. 精确判断截断条件

    **BOOL** isTruncated = **NO**;

    **if** (layout) {

        // 关键:实际行数超过最大行数 或 存在截断标识

        isTruncated = (layout.rowCount > maxLines) || (layout.truncatedLine != **nil**);

    }

    **return** isTruncated;

}