项目中遇到富文本的展示和点击,找了很久,发现都没封装,功能虽然强大,学习成本大,用起来太复杂!!!,所以自己封装了一个使用简单的,希望对你有用。
- 功能介绍:
1:添加普通图片
2:添加可以点击的图片,带回调。
3:添加普通文字
4:添加可以点击的文字,带回调。
5:支持自动换行
上面每个功能都是一个方法,直接调用就OK了
- 效果如下: 屏幕快照 2019-08-16 下午2.41.56.png
OC项目封装库(自己项目在用,并不断维护更新):https://github.com/zjjzmw1/XM_OC_TOOL
YYLabel_XM 这个类就封装在上面这个项目中~
YYLabel_XM.h
/// -------------------------- 需要引用第三方库: pod 'YYText', '~> 1.0.7' --------------------------
#import "YYLabel.h"
#import "YYText.h"
/// 下面的方法用到的block - 点击图片的回调,返回点击后展示的图片。
typedef void(^kCurrentShowImg)(UIImage * __nullable currentShowImg);
NS_ASSUME_NONNULL_BEGIN
/// -------------------------- 图文混排、点击 -- 方法封装 --------------------------
@interface YYLabel_XM : YYLabel
// ==========================---------两步实现复制的富文本BEGIN------------==========================
/// 第一步: - 初始化YYLabel_XM
+ (YYLabel_XM *)getLabelWithFrame:(CGRect)frame textAlignment:(NSTextAlignment)alignment;
/// 第二步: - 添加 ”子字符串“
- (void)addAttriStr:(NSString *)str font:(UIFont *)font textColor:(UIColor *)textColor;
/// 第二步: - 添加【可点击】的 ”子字符串“
- (void)addAttriStrCanClick:(NSString *)str
font:(UIFont *)font
textColor:(UIColor *)textColor
highLightTextColor:(UIColor *)highLightTextColor
highLightBgColor:(UIColor *)highLightBgColor
tapAction:(YYTextAction)tapAction;
/// 第二步: - 添加图片 - imgSize传CGSizeZero的时候用默认为:CGSizeMake(20, 20) 图片大小会影响行间距,太大也可能会导致无法换行
- (void)addAttriImage:(UIImage *)img imgSize:(CGSize)imgSize;
/// 第二步: - 添加图片和选中图片 - imgSize是图片所占的位置大小,图片显示的大小取决于图片本身的大小。nearbyFont 和相邻文字的大小一样(太大太小都不行),否则会出现图片和文字centerY不居中的bug
- (void)addAttriImageCanClick:(UIImage *)img
highLightImg:(UIImage *)highLightImg
imgSize:(CGSize)imgSize
imgTag:(int)imgTag
nearbyFont:(UIFont *)font
currentShowImg:(kCurrentShowImg)currentShowImg;
// ==========================---------两步实现复制的富文本END------------==========================
/// !!(一般用不到,除非想自定义一些特殊的样式) 当前label的attributedText属性值 【或者】 想刷新富文本的时候,需要把 ‘myAttriStr’这个属性清空或者重新初始化,然后重新执行上面的第二步就ok了。
@property (nonatomic, strong) NSMutableAttributedString *myAttriStr;
@end
NS_ASSUME_NONNULL_END
YYLabel_XM.m
//
// YYLabel_XM.m
// 艺库
//
// Created by zhangmingwei on 2019/8/15.
// Copyright © 2019 YiKuNetwork. All rights reserved.
//
#import "YYLabel_XM.h"
@interface YYLabel_XM()
/// 对齐方式
@property (nonatomic, assign) NSTextAlignment myAlignment;
/// 记录当前图片的标记字典
@property (nonatomic, strong) NSMutableDictionary *imgDict;
@end
@implementation YYLabel_XM
/// 第一步: - 初始化YYLabel_XM
+ (YYLabel_XM *)getLabelWithFrame:(CGRect)frame textAlignment:(NSTextAlignment)alignment {
//1.简单显示label
YYLabel_XM *label = [[YYLabel_XM alloc] init];
label.frame = frame;
//异步渲染 当一个label显示巨量文字的时候就能明显感觉到此功能的强大
label.displaysAsynchronously = YES;
label.myAttriStr = [[NSMutableAttributedString alloc] initWithString:@""];
/// 在这里设置对齐方式无效,必须在赋值后面设置才行
label.myAlignment = alignment;
label.imgDict = [NSMutableDictionary dictionary];
label.numberOfLines = 0;
label.preferredMaxLayoutWidth = kScreenWidth_XM - 100;
return label;
}
/// 第二步: - 添加 ”子字符串“
- (void)addAttriStr:(NSString *)str font:(UIFont *)font textColor:(UIColor *)textColor {
NSMutableAttributedString *attri = [[NSMutableAttributedString alloc] initWithString:str];
attri.yy_color = textColor; // 整个的颜色
[attri yy_setFont:font range:NSMakeRange(0, str.length)]; // 某段字符串的字体两种方式都行。
[self.myAttriStr appendAttributedString:attri];
/// 最终赋值
[self lastUpdateAction];
}
/// 第二步: - 添加【可点击】的 ”子字符串“
- (void)addAttriStrCanClick:(NSString *)str
font:(UIFont *)font
textColor:(UIColor *)textColor
highLightTextColor:(UIColor *)highLightTextColor
highLightBgColor:(UIColor *)highLightBgColor
tapAction:(YYTextAction)tapAction {
NSMutableAttributedString *attri = [[NSMutableAttributedString alloc] initWithString:str];
attri.yy_color = textColor;
attri.yy_font = font; // 整个的字体
[attri yy_setFont:font range:NSMakeRange(0, str.length)];//某段的字体,和上面一行目前是一样
/// 选中状态的颜色和点击事件
[attri yy_setTextHighlightRange:NSMakeRange(0, str.length) color:highLightTextColor backgroundColor:highLightBgColor tapAction:tapAction];
/// 添加到总的图文
[self.myAttriStr appendAttributedString:attri];
/// 最终赋值
[self lastUpdateAction];
}
/// 第二步: - 添加图片 - imgSize传CGSizeZero的时候用默认为:CGSizeMake(20, 20)
- (void)addAttriImage:(UIImage *)img imgSize:(CGSize)imgSize {
CGSize lastImgSize = imgSize;
if (imgSize.width == 0 || imgSize.height == 0) {
lastImgSize = CGSizeMake(20, 20);
}
NSMutableAttributedString *attachText = [NSMutableAttributedString yy_attachmentStringWithContent:img contentMode:UIViewContentModeCenter attachmentSize:lastImgSize alignToFont:FontWithSize(15) alignment:YYTextVerticalAlignmentCenter];
/// 添加到总的图文
[self.myAttriStr appendAttributedString:attachText];
/// 最终赋值
[self lastUpdateAction];
}
/// 第二步: - 添加图片和选中图片 - imgSize是图片所占的位置大小,图片显示的大小取决于图片本身的大小。nearbyFont 和相邻文字的大小一样(太大太小都不行),否则会出现图片和文字centerY不居中的bug
- (void)addAttriImageCanClick:(UIImage *)img
highLightImg:(UIImage *)highLightImg
imgSize:(CGSize)imgSize
imgTag:(int)imgTag
nearbyFont:(UIFont *)font
currentShowImg:(kCurrentShowImg)currentShowImg {
CGSize lastImgSize = imgSize;
if (imgSize.width == 0 || imgSize.height == 0) {
lastImgSize = CGSizeMake(20, 20);
}
/// 添加当前图片标记
[self.imgDict setObject:[NSString stringWithFormat:@"%d",(int)self.textLayout.attachments.count] forKey:[NSString stringWithFormat:@"%d",imgTag]];
/// alignToFont 要和当前图片相邻的文字字体一样大,否则图片centerY不居中。
NSMutableAttributedString *attachText = [NSMutableAttributedString yy_attachmentStringWithContent:img contentMode:UIViewContentModeCenter attachmentSize:lastImgSize alignToFont:font alignment:YYTextVerticalAlignmentCenter];
__weak typeof(self) wSelf = self;
[attachText yy_setTextHighlightRange:NSMakeRange(0, attachText.length) color:[UIColor clearColor] backgroundColor:[UIColor clearColor] tapAction:^(UIView * _Nonnull containerView, NSAttributedString * _Nonnull text, NSRange range, CGRect rect) {
//获取图片资源
NSArray *attachments = wSelf.textLayout.attachments;
for (int i = 0; i < attachments.count; i++) {
YYTextAttachment *attachment = attachments[I];
/// 获取当前图片的标记
int currentImgRow = [[wSelf.imgDict objectForKey:[NSString stringWithFormat:@"%d",imgTag]] intValue];
if (currentImgRow == i) { // 确实是点击的图片,才更换
if ([attachment.content isEqual:img]) {
attachment.content = highLightImg;
} else {
attachment.content = img;
}
currentShowImg((UIImage *)attachment.content);
}
}
}];
/// 添加到总的图文
[self.myAttriStr appendAttributedString:attachText];
/// 最终赋值
[self lastUpdateAction];
}
/// 最终调用统一的赋值方法
- (void)lastUpdateAction {
/// 把总的图文赋值给label
self.attributedText = self.myAttriStr;
/// 对齐方式 -- 必须在赋值后,设置对齐方式才生效。
self.myAttriStr.yy_alignment = self.myAlignment;
}
@end
网友评论