CJLabel
继承自UILabel
,在支持UILabel
所有属性的基础上,还提供富文本、图文混排、任意view插入展示、自定义点击链点设置、长按(双击)唤起UIMenuController
选择复制文本等功能。
- 禁止使用
-init
初始化!! enableCopy
长按或双击可唤起UIMenuController
进行选择、全选、复制文本操作attributedText
与text
均可设置富文本- 不支持
NSAttachmentAttributeName
,NSTextAttachment
!!
显示图片请调用:
+ initWithView:viewSize:lineAlignment:configure:
或者
+ insertViewAtAttrString:view:viewSize:atIndex:lineAlignment:configure:
方法初始化NSAttributedString
后显示 extendsLinkTouchArea
设置是否扩大链点点击识别范围shadowRadius
设置文本阴影模糊半径textInsets
设置文本内边距verticalAlignment
设置垂直方向的文本对齐方式。注意与显示图片时候的imagelineAlignment
作区分,self.verticalAlignment
对应的是整体文本在垂直方向的对齐方式,而imagelineAlignment
只对图片所在行的垂直对齐方式有效delegate
点击链点代理attributedTruncationToken
自定义截断字符,默认"...",只针对self.lineBreakMode
的以下三种值有效,假如attributedTruncationToken
=***
,则:
NSLineBreakByTruncatingHead, // 头部截断: "***wxyz"
NSLineBreakByTruncatingTail, // 中间截断: "abcd***"
NSLineBreakByTruncatingMiddle // 尾部截断: "ab***yz"
kCJBackgroundFillColorAttributeName
背景填充颜色,属性优先级低于NSBackgroundColorAttributeName
如果设置NSBackgroundColorAttributeName
会忽略kCJBackgroundFillColorAttributeName
的设置kCJBackgroundStrokeColorAttributeName
背景边框线颜色kCJBackgroundLineWidthAttributeName
背景边框线宽度kCJBackgroundLineCornerRadiusAttributeName
背景边框线圆角弧度kCJActiveBackgroundFillColorAttributeName
点击时候的背景填充颜色属性优先级同kCJBackgroundFillColorAttributeName
kCJActiveBackgroundStrokeColorAttributeName
点击时候的背景边框线颜色- 支持添加自定义样式、可点击(长按)的文本点击链点
- 支持 Interface Builder
numberOfLines
大于0且小于实际label.numberOfLines
,同时verticalAlignment
不等于CJContentVerticalAlignmentTop
时,文本显示位置有偏差。如下图所示:
下载demo,将CJLabel文件夹导入项目,引用头文件 #import "CJLabel.h"
pod 'CJLabel'
- 根据NSAttributedString计算CJLabel的size大小
CGSize size = [CJLabel sizeWithAttributedString:str withConstraints:CGSizeMake(320, CGFLOAT_MAX) limitedToNumberOfLines:0];
- 指定内边距以及限定行数计算CJLabel的size大小
CGSize size = [CJLabel sizeWithAttributedString:str withConstraints:CGSizeMake(320, CGFLOAT_MAX) limitedToNumberOfLines:0 textInsets:3];
- 设置富文本展示
//初始化配置
CJLabelConfigure *configure = [CJLabel configureAttributes:nil isLink:NO activeLinkAttributes:nil parameter:nil clickLinkBlock:nil longPressBlock:nil];
//设置配置属性
configure.attributes = @{NSFontAttributeName:[UIFont boldSystemFontOfSize:18]};
//设置指定字符属性
attStr = [CJLabel configureAttrString:attStr withString:@"不同字体" sameStringEnable:NO configure:configure];
NSRange imgRange = [attStr.string rangeOfString:@"插入图片"];
//移除指定属性
[configure removeAttributesForKey:kCJBackgroundStrokeColorAttributeName];
//指定位置插入图片
UIImageView *imgView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"CJLabel.png"]];
imgView.contentMode = UIViewContentModeScaleAspectFill;
imgView.clipsToBounds = YES;
attStr = [CJLabel insertViewAtAttrString:attStr view:imgView viewSize:CGSizeMake(55, 45) atIndex:(imgRange.location+imgRange.length) lineAlignment:CJVerticalAlignmentBottom configure:configure];
//设置内边距
self.label.textInsets = UIEdgeInsetsMake(10, 10, 10, 0);
self.label.attributedText = attStr;
- 垂直对齐、选择复制
//设置垂直对齐方式
self.label.verticalAlignment = CJVerticalAlignmentCenter;
self.label.text = self.attStr;
//支持选择复制
self.label.enableCopy = YES;
- 设置文字、图片点击链点
//设置点击链点属性
configure.attributes = @{NSForegroundColorAttributeName:[UIColor blueColor]};
//设置点击高亮属性
configure.activeLinkAttributes = @{NSForegroundColorAttributeName:[UIColor redColor]};
//链点自定义参数
configure.parameter = @"参数为字符串";
//点击回调(也可通过设置self.label.delegate = self代理,返回点击回调事件)
configure.clickLinkBlock = ^(CJLabelLinkModel *linkModel) {
//do something
};
//长按回调
configure.longPressBlock = ^(CJLabelLinkModel *linkModel) {
//do something
};
//设置为可点击链点
configure.isLink = YES;
//设置点击链点
attStr = [CJLabel configureAttrString:attStr
withString:@"CJLabel"
sameStringEnable:YES
configure:configure];
//设置图片点击链点属性
NSRange imageRange = [attStr.string rangeOfString:@"图片"];
CJLabelConfigure *imgConfigure =
[CJLabel configureAttributes:@{kCJBackgroundStrokeColorAttributeName:[UIColor redColor]}
isLink:YES
activeLinkAttributes:@{kCJActiveBackgroundStrokeColorAttributeName:[UIColor lightGrayColor]}
parameter:@"图片参数"
clickLinkBlock:^(CJLabelLinkModel *linkModel){
[self clickLink:linkModel isImage:YES];
}
longPressBlock:^(CJLabelLinkModel *linkModel){
[self clicklongPressLink:linkModel isImage:YES];
}];
attStr = [CJLabel insertViewAtAttrString:attStr view:@"CJLabel.png" viewSize:CGSizeMake(45, 35) atIndex:(imageRange.location+imageRange.length) lineAlignment:verticalAlignment configure:imgConfigure];
self.label.attributedText = attStr;
//支持选择复制
self.label.enableCopy = YES;
- 自定义截断文本,并设置为可点击
//配置链点属性
configure.isLink = YES;
configure.clickLinkBlock = ^(CJLabelLinkModel *linkModel) {
//点击 `……全文`
[self clickTruncationToken:linkModel];
};
configure.attributes = @{NSForegroundColorAttributeName:[UIColor blueColor],NSFontAttributeName:[UIFont systemFontOfSize:13]};
//自定义截断字符为:"……全文"
NSAttributedString *truncationToken = [CJLabel initWithAttributedString:[[NSAttributedString alloc]initWithString:@"……全文"] strIdentifier:@"TruncationToken" configure:configure];
//设置行尾截断
self.label.lineBreakMode = NSLineBreakByTruncatingTail;
self.label.attributedTruncationToken = truncationToken;
//设置点击链点
attStr = [CJLabel configureAttrString:attStr withAttributedString:truncationToken strIdentifier:@"TruncationToken" sameStringEnable:NO configure:configure];
self.label.attributedText = attStr;
//支持选择复制
self.label.enableCopy = YES;
- V4.6.0
支持显示任意view - V4.5.0 V4.5.1 V4.5.3
增加attributedTruncationToken
属性,支持自定义截断字符;增加kCJStrikethroughStyleAttributeName、kCJStrikethroughColorAttributeName
属性,可对指定文本添加删除线 - V4.4.0
优化NSAttributedString链点属性设置 - V4.0.0
新增enableCopy
属性,支持选择、全选、复制功能,类似UITextView
的选择复制效果。 - V3.0.0
优化富文本配置方法,新增CJLabelConfigure类,简化方法调用,增加对NSAttributedString点击链点的判断(比如对于两个重名用户:@lele 和 @lele,可以分别设置不同的点击响应事件)
注意V3.0.0
版本引入CJLabelConfigure
类,优化了NSAttributedString的设置,旧的配置API不再支持。相关调用请参照以下相关方法
+ initWithImage:imageSize:imagelineAlignment:configure:
+ initWithString:configure:
+ initWithAttributedString:strIdentifier:configure:
- V2.1.2
可修改图片所在行在垂直方向的对齐方式(只针对当前行),有居上、居中、居下选项,默认居下 - V2.1.1
修复单行文字时候点击链点的判断,增加delegate - V2.0.0
优化点击链点响应判断,增加插入图片、插入图片链点、点击链点背景色填充、点击链点边框线描边等功能 v2.0.0之后版本与v1.x.x版本差别较大,基本上重写了增加以及移除点击链点的API - V1.0.2
点击链点增加扩展属性parameter - V1.0.1
增加文本中内容相同的链点能够响应点击属性sameLinkEnable,必须在设置self.attributedText前赋值,默认值为NO,只取文本中首次出现的链点。 - V1.0.0
支持链点点击响应
CJLabel 使用 MIT 许可证,详情见 LICENSE 文件。
CJLabel图文混排二 —— UILabel插入图片以及精确链点点击
CJLabel图文混排一 ——UILabel富文本显示以及任意字符的点击响应
CJLabel富文本三 —— UILabel支持选择复制以及实现原理