一、YYLabel
强大的富文本显示功能,可根据文字的range随意添加点击事件
1 自动换行
YYLabel *yyLabel = [YYLabel new];
yyLabel.numberOfLines = 0;
创建容器
YYTextContainer *titleContarer = [YYTextContainer new];
限制宽度
titleContarer.size = CGSizeMake([UIScreen mainScreen].bounds.size.width-40,CGFLOAT_MAX);
设置富文本
NSMutableAttributedString *resultAttr = [self getAttr:title];
根据容器和文本创建布局对象
YYTextLayout *titleLayout = [YYTextLayout layoutWithContainer:titleContarer text:resultAttr];
得到文本高度
CGFloat titleLabelHeight = titleLayout.textBoundingSize.height;
设置frame
yyLabel.frame = CGRectMake(20,84,[UIScreen mainScreen].bounds.size.width-40,titleLabelHeight);
2 各种格式设置
对齐方式 这里是 两边对齐
resultAttr.alignment = NSTextAlignmentCenter;
设置行间距
resultAttr.lineSpacing = 3;
resultAttr.font = [UIFont systemFontOfSize:20];
{
NSRange range = [attributedString rangeOfString:@"it was the worst of times"];
[resultAttr setFont:[UIFont boldSystemFontOfSize:30] range:range];
}
描边
{
NSRange range =[attributedString rangeOfString:@"it was the age of wisdom"];
//文字描边(空心字)默认黑色,必须设置width
[resultAttr setStrokeColor:[UIColor orangeColor] range:range];
[resultAttr setStrokeWidth:@(2) range:range];
}
划线
{
NSRange range = [attributedString rangeOfString:@"it was the age of foolishness, it was the season of light" options:NSCaseInsensitiveSearch];
YYTextDecoration *decoration = [YYTextDecoration decorationWithStyle:YYTextLineStyleSingle
width:@(1)
color:[UIColor blueColor]];
//删除样式
[resultAttr setTextStrikethrough:decoration range:range];
//下划线
[resultAttr setTextUnderline:decoration range:range];
}
设置边框
{
NSRange range = [attributedString rangeOfString:@"这是最好的时代,这是最坏的时代" options:NSCaseInsensitiveSearch];
//边框
YYTextBorder *border = [YYTextBorder new];
border.strokeColor = [UIColor redColor];
border.strokeWidth = 4;
border.lineStyle = YYTextLineStylePatternDashDotDot;
border.cornerRadius = 1;
border.insets = UIEdgeInsetsMake(0, -2, 0, -2);
[resultAttr setTextBorder:border range:range];
}
设置阴影
{
NSRange range = [attributedString rangeOfString:@"这是智慧的时代,这是愚蠢的时代" options:NSCaseInsensitiveSearch];
//阴影
NSShadow *shadow = [[NSShadow alloc] init];
[shadow setShadowColor:[UIColor redColor]];
[shadow setShadowBlurRadius:1.0];
[shadow setShadowOffset:CGSizeMake(2, 2)];
[resultAttr setShadow:shadow range:range];
}
3 高亮显示文本 点击交互事件
{
NSRange range = [attributedString rangeOfString:@"这是希望之春,这是失望之冬" options:NSCaseInsensitiveSearch];
YYTextBorder *border = [YYTextBorder new];
border.cornerRadius = 50;
border.insets = UIEdgeInsetsMake(0, -10, 0, -10);
border.strokeWidth = 0.5;
border.strokeColor = [UIColor yellowColor];
border.lineStyle = YYTextLineStyleSingle;
[resultAttr setTextBorder:border range:range];
[resultAttr setTextBackgroundBorder:border range:range];
[resultAttr setColor:[UIColor greenColor] range:range];
YYTextBorder *highlightBorder = border.copy;
highlightBorder.strokeWidth = 0;
highlightBorder.strokeColor = [UIColor purpleColor];
highlightBorder.fillColor = [UIColor purpleColor];
YYTextHighlight *highlight = [YYTextHighlight new];
[highlight setColor:[UIColor whiteColor]];
[highlight setBackgroundBorder:highlightBorder ];
highlight.tapAction = ^(UIView *containerView, NSAttributedString *text, NSRange range, CGRect rect) {
[self alertShow:[NSString stringWithFormat:@"Tap: %@",[text.string substringWithRange:range]]];
};
[resultAttr setTextHighlight:highlight range:range];
// 点击复制
[resultAttr setTextHighlightRange:[attributedString rangeOfString:@"450351763"]
color:[UIColor greenColor]
backgroundColor:[UIColor whiteColor]
tapAction:^(UIView *containerView, NSAttributedString *text, NSRange range, CGRect rect){
UIPasteboard *pboard = [UIPasteboard generalPasteboard];
pboard.string = @"450351763";
[self alertShow:@"复制成功"];
}];
}
4 图文混排 支持各种格式包括gif
{
for (int i = 1; i<5; i++) {
NSString *path;
if(i == 4){
path = [[NSBundle mainBundle] pathForScaledResource:[NSString stringWithFormat:@"%d",i] ofType:@"gif"];
}else{
path = [[NSBundle mainBundle] pathForScaledResource:[NSString stringWithFormat:@"%d",i] ofType:@"jpg"];
}
NSData *data = [NSData dataWithContentsOfFile:path];
//修改表情大小
YYImage *image = [YYImage imageWithData:data scale:3];
image.preloadAllAnimatedImageFrames = YES;
YYAnimatedImageView *imageView = [[YYAnimatedImageView alloc] initWithImage:image];
NSMutableAttributedString *attachText = [NSMutableAttributedString attachmentStringWithContent:imageView contentMode:UIViewContentModeCenter attachmentSize:imageView.size alignToFont:[UIFont systemFontOfSize:18] alignment:YYTextVerticalAlignmentCenter];
[resultAttr appendAttributedString:attachText];
}
}
YYkit推荐pod安装方式(我使用的是 pod 'YYKit', '~> 1.0.9' 最新版本)
以下为全部代码贴到项目中可以直接运行查看效果
@interfaceViewController2()
@end
@implementationViewController2
- (void)viewDidLoad {
[superviewDidLoad];
self.view.backgroundColor= [UIColorcolorWithRed:0.3green:0.5blue:0.8alpha:1];
[self showYYLabel];
}
-(void)showYYLabel{
NSString*title =@"It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the season of light, it was the season of darkness, it was the spring of hope, it was the winter of despair, we had everything before us, we had nothing before us. We were all going direct to heaven, we were all going direct the other way.\n这是最好的时代,这是最坏的时代;这是智慧的时代,这是愚蠢的时代;这是信仰的时期,这是怀疑的时期;这是光明的季节,这是黑暗的季节;这是希望之春,这是失望之冬;人们面前有着各样事物,人们面前一无所有;人们正在直登天堂,人们正在直下地狱。\n点击复制QQ450351763进行在线咨询";
YYLabel *yyLabel = [YYLabelnew];
yyLabel.backgroundColor= [UIColorcolorWithRed:0.3green:0.4blue:0.1alpha:1];
//异步显示
yyLabel.displaysAsynchronously=YES;
yyLabel.numberOfLines=0;
//创建容器
YYTextContainer*titleContarer = [YYTextContainernew];
//限制宽度
titleContarer.size= CGSizeMake([UIScreenmainScreen].bounds.size.width-40,CGFLOAT_MAX);
//设置富文本
NSMutableAttributedString *resultAttr = [selfgetAttr:title];
//根据容器和文本创建布局对象
YYTextLayout*titleLayout = [YYTextLayoutlayoutWithContainer:titleContarertext:resultAttr];
//得到文本高度
CGFloat titleLabelHeight = titleLayout.textBoundingSize.height;
//设置frame
yyLabel.frame= CGRectMake(20,84,[UIScreenmainScreen].bounds.size.width-40,titleLabelHeight);
yyLabel.attributedText= titleAttr;
[self.viewaddSubview:yyLabel];
}
- (NSMutableAttributedString*)getAttr:(NSString*)attributedString {
NSMutableAttributedString*resultAttr = [[NSMutableAttributedStringalloc]initWithString:attributedString];
// 一、 格式设置
//对齐方式 这里是 两边对齐
resultAttr.alignment= NSTextAlignmentCenter;
//设置行间距
resultAttr.lineSpacing=3;
resultAttr.font= [UIFontsystemFontOfSize:20];
{
NSRange range = [attributedStringrangeOfString:@"it was the worst of times"];
[resultAttrsetFont:[UIFontboldSystemFontOfSize:30]range:range];
}
//描边
{
NSRange range =[attributedStringrangeOfString:@"it was the age of wisdom"];
//文字描边(空心字)默认黑色,必须设置width
[resultAttrsetStrokeColor:[UIColororangeColor]range:range];
[resultAttrsetStrokeWidth:@(2)range:range];
}
//划线
{
NSRange range = [attributedStringrangeOfString:@"it was the age of foolishness, it was the season of light"options:NSCaseInsensitiveSearch];
YYTextDecoration*decoration = [YYTextDecorationdecorationWithStyle:YYTextLineStyleSingle
width:@(1)
color:[UIColorblueColor]];
//删除样式
[resultAttrsetTextStrikethrough:decorationrange:range];
//下划线
[resultAttrsetTextUnderline:decorationrange:range];
}
//设置边框
{
NSRange range = [attributedStringrangeOfString:@"这是最好的时代,这是最坏的时代"options:NSCaseInsensitiveSearch];
//边框
YYTextBorder*border = [YYTextBordernew];
border.strokeColor= [UIColorredColor];
border.strokeWidth=4;
border.lineStyle= YYTextLineStylePatternDashDotDot;
border.cornerRadius=1;
border.insets= UIEdgeInsetsMake(0, -2,0, -2);
[resultAttrsetTextBorder:borderrange:range];
}
//设置阴影
{
NSRange range = [attributedStringrangeOfString:@"这是智慧的时代,这是愚蠢的时代"options:NSCaseInsensitiveSearch];
//阴影
NSShadow*shadow = [[NSShadowalloc]init];
[shadowsetShadowColor:[UIColorredColor]];
[shadowsetShadowBlurRadius:1.0];
[shadowsetShadowOffset:CGSizeMake(2,2)];
[resultAttrsetShadow:shadowrange:range];
}
//高亮显示文本
{
NSRange range = [attributedStringrangeOfString:@"这是希望之春,这是失望之冬"options:NSCaseInsensitiveSearch];
YYTextBorder*border = [YYTextBordernew];
border.cornerRadius=50;
border.insets= UIEdgeInsetsMake(0, -10,0, -10);
border.strokeWidth=0.5;
border.strokeColor= [UIColoryellowColor];
border.lineStyle= YYTextLineStyleSingle;
[resultAttrsetTextBorder:borderrange:range];
[resultAttrsetTextBackgroundBorder:borderrange:range];
[resultAttrsetColor:[UIColorgreenColor]range:range];
YYTextBorder*highlightBorder = border.copy;
highlightBorder.strokeWidth=0;
highlightBorder.strokeColor= [UIColorpurpleColor];
highlightBorder.fillColor= [UIColorpurpleColor];
YYTextHighlight*highlight = [YYTextHighlightnew];
[highlightsetColor:[UIColorwhiteColor]];
[highlightsetBackgroundBorder:highlightBorder ];
highlight.tapAction= ^(UIView*containerView,NSAttributedString*text, NSRange range, CGRect rect) {
[selfalertShow:[NSStringstringWithFormat:@"Tap: %@",[text.stringsubstringWithRange:range]]];
};
[resultAttrsetTextHighlight:highlightrange:range];
// 点击复制
[resultAttrsetTextHighlightRange:[attributedStringrangeOfString:@"450351763"]
color:[UIColorgreenColor]
backgroundColor:[UIColorwhiteColor]
tapAction:^(UIView*containerView,NSAttributedString*text, NSRange range, CGRect rect){
UIPasteboard*pboard = [UIPasteboardgeneralPasteboard];
pboard.string=@"450351763";
[selfalertShow:@"复制成功"];
}];
}
// 图文混排
{
for(inti =1; i<5; i++) {
NSString*path;
if(i ==4){
path = [[NSBundlemainBundle]pathForScaledResource:[NSStringstringWithFormat:@"%d",i]ofType:@"gif"];
}else{
path = [[NSBundlemainBundle]pathForScaledResource:[NSStringstringWithFormat:@"%d",i]ofType:@"jpg"];
}
NSData*data = [NSDatadataWithContentsOfFile:path];
//修改表情大小
YYImage*image = [YYImageimageWithData:datascale:3];
image.preloadAllAnimatedImageFrames=YES;
YYAnimatedImageView*imageView = [[YYAnimatedImageViewalloc]initWithImage:image];
NSMutableAttributedString*attachText = [NSMutableAttributedStringattachmentStringWithContent:imageViewcontentMode:UIViewContentModeCenterattachmentSize:imageView.sizealignToFont:[UIFontsystemFontOfSize:18]alignment:YYTextVerticalAlignmentCenter];
[resultAttrappendAttributedString:attachText];
}
}
returnresultAttr;
}
-(void)alertShow:(NSString*)str{
UIAlertController*vc = [UIAlertControlleralertControllerWithTitle:nilmessage:strpreferredStyle:UIAlertControllerStyleActionSheet];
[self.navigationControllerpresentViewController:vcanimated:YEScompletion:^{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[vcdismissViewControllerAnimated:YEScompletion:^{
}];
});
}];
}