文字结尾一直存在一个查看更多的按钮,当文字超出限制时使用...+按钮,不超出限制行数时显示:按钮
`///处理内容
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;
}