效果:

====直接上代码吧===

//
// UILabel+StringFrame.h
// QYER
//
// Created by qyer on 15/3/19.
// Copyright (c) 2015年 QYER. All rights reserved.
// #import <UIKit/UIKit.h> /**
* uilable 行间距高度
*/
static CGFloat const lineSapceHeight = 5.0f; @interface UILabel (StringFrame) #pragma mark - 获取UILable Size - (CGSize)boundingRectWithSize:(CGSize)size;
/**
* 根据文字长度计算大小
*
* @param content 文字长度
* @param pFont 文字字号
* @param pWidth 宽度
*
*/
+(CGSize)getContentSize:(NSString *)content font:(UIFont *)pFont width:(CGFloat)pWidth;
/**
* 根据文字长度计算大小
*
* @param content 文字长度
* @param pFont 文字字号
* @param pHeight 高度
*
*/
+(CGSize)getContentSize:(NSString *)content font:(UIFont *)pFont height:(CGFloat)pHeight;
/**
* 根据文本获取size ,有最大 宽高限制
*
* @param string 文本
* @param maxWidth 最大宽
* @param maxHeight 最大高
* @param font 字体
* @param lineSpace 行间距(如果使用默认的,就传nil)
*
* @return size
*/
+(CGSize)getContentSizeWithContentText:(NSString *)string andMaxWidth:(CGFloat)maxWidth andMaxHeight:(CGFloat)maxHeight AndFont:(UIFont*)font andLineSpacing:(NSNumber *)lineSpace;
/**
* 根据文本获取size ,有最大 宽高限制
*
* @param string 文本
* @param maxWidth 最大宽
* @param maxHeight 最大高
* @param attribute 富文本属性
*
* @return size
*/
+(CGSize)getContentSizeWithContentText:(NSString *)string andMaxWidth:(CGFloat)maxWidth andMaxHeight:(CGFloat)maxHeight andAttributes:(NSDictionary *)attribute; #pragma mark - 获取UILable 每行显示的文字 /**
* 获取lalbe 每行文字
*
* @return 每行文字数组
*/
- (NSArray *)getSeparatedLines;
/**
* 获取lalbe 每行文字
*
* @param text 根据文字内容
*
* @return 每行文字数组
*/
- (NSArray *)getSeparatedLinesWithText:(NSString*)text;
/**
* 获取lalbe 每行文字
*
* @param content 文字内容
* @param fonte fonte description
* @param size size description
*
* @return return value description
*/
+(NSArray *)getSeparatedLinesWithText:(NSString*)content andFonte:(UIFont *)fonte andSize:(CGSize)size; #pragma mark - 完美解决 向UILable 文字最后插入N张图片,支持向限制行数的UILable 最后一行插入,多余文字显示... /**
* 向文字末尾追加图片,适用于已知Size的UILable
*
* @param contentStr 文字内容
* @param imgs 插入的图片数组, 图片最好带间隔哦
*/
-(void)insertImgToContentLast:(NSString *)contentStr imgs:(NSArray *)imgs;
/**
* 向文字末尾追加图片,适用于AutoLayout 的UILable
*
* @param contentStr 文字内容
* @param imgs 插入的图片数组, 图片最好带间隔哦
* @param estimateWidth 预估的UILable 最大宽度(已知的最大宽度)
*/
-(void)insertImgToContentLast:(NSString *)contentStr imgs:(NSArray *)imgs estimateWidth:(CGFloat)estimateWidth;
/**
* 向已知文字后插入图片
*
* @param insertImgArr insertImgArr description
* @param appendAttributedString 可为nil
*/
-(void)configTitleLableAttributedString:(NSArray *)insertImgArr AttributedString:(NSMutableAttributedString *)appendAttributedString; @end
//
// UILabel+StringFrame.m
// QYER
//
// Created by qyer on 15/3/19.
// Copyright (c) 2015年 QYER. All rights reserved.
// #import "UILabel+StringFrame.h" #import <CoreText/CoreText.h> @implementation UILabel (StringFrame) #pragma mark - 获取UILable Size - (CGSize)boundingRectWithSize:(CGSize)size
{
NSDictionary *attribute = @{NSFontAttributeName: self.font}; CGSize retSize = [self.text boundingRectWithSize:size
options:\
NSStringDrawingTruncatesLastVisibleLine |
NSStringDrawingUsesLineFragmentOrigin |
NSStringDrawingUsesFontLeading
attributes:attribute
context:nil].size; return retSize;
} +(CGSize)getContentSize:(NSString *)content font:(UIFont *)pFont width:(CGFloat)pWidth{ CGSize contentSize;
if (ios7) {
contentSize = [content boundingRectWithSize:CGSizeMake(pWidth, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObjectsAndKeys:pFont,NSFontAttributeName, nil] context:nil].size;
}else{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
contentSize = [content sizeWithFont:pFont constrainedToSize:CGSizeMake(pWidth, MAXFLOAT) lineBreakMode:NSLineBreakByCharWrapping];
#pragma clang diagnostic pop }
return contentSize;
} +(CGSize)getContentSize:(NSString *)content font:(UIFont *)pFont height:(CGFloat)pHeight{ CGSize contentSize;
if (ios7) {
contentSize = [content boundingRectWithSize:CGSizeMake(MAXFLOAT, pHeight) options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObjectsAndKeys:pFont,NSFontAttributeName, nil] context:nil].size;
}else{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
contentSize = [content sizeWithFont:pFont constrainedToSize:CGSizeMake(MAXFLOAT, pHeight) lineBreakMode:NSLineBreakByCharWrapping];
#pragma clang diagnostic pop }
return contentSize;
} /**
* 根据文本获取size ,有最大 宽高限制
*
* @param string 文本
* @param maxWidth 最大宽
* @param maxHeight 最大高
* @param attribute 富文本属性
*
* @return size
*/
+(CGSize)getContentSizeWithContentText:(NSString *)string andMaxWidth:(CGFloat)maxWidth andMaxHeight:(CGFloat)maxHeight andAttributes:(NSDictionary *)attribute{
CGSize size = CGSizeZero;
if (IsEmpty(string)) {
return size;
}
if (string) {
if ([string respondsToSelector:
@selector(boundingRectWithSize:options:attributes:context:)]) {
size = [string boundingRectWithSize:CGSizeMake(maxWidth, maxHeight)
options:NSStringDrawingUsesLineFragmentOrigin| NSStringDrawingTruncatesLastVisibleLine |NSStringDrawingUsesFontLeading
attributes:attribute
context:nil].size;
}else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
size = [string sizeWithFont:attribute[@"NSFontAttributeName"]
constrainedToSize:CGSizeMake(maxWidth, maxHeight)
lineBreakMode:NSLineBreakByCharWrapping];
#pragma clang diagnostic pop
}
}
if (!CGSizeEqualToSize(CGSizeZero, size)) { CGFloat wight = maxWidth;
CGFloat height = ceil(size.height);
/**
* 使用 NIAttributedLabel 有个bug ,当文字只有一行或不满一行 会出现文字显示不出来
*/
if (!attribute) {
NSArray *rows = [UILabel getSeparatedLinesWithText:string andFonte:attribute[NSFontAttributeName] andSize:size];
if ([rows count]==1) {
CGSize offsetSize = [UILabel getContentSize:string font:attribute[NSFontAttributeName] width:maxWidth];
size = CGSizeMake(ceil(offsetSize.width) , ceil(offsetSize.height));
}else{
size = CGSizeMake(wight ,height);
}
}else {
size = CGSizeMake(wight ,height);
}
}
return size;
} /**
* 根据文本获取size ,有最大 宽高限制
*
* @param string 文本
* @param maxWidth 最大宽
* @param maxHeight 最大高
* @param font 字体
* @param lineSpace 行间距(如果使用默认的,就传nil)
*
* @return size
*/
+(CGSize)getContentSizeWithContentText:(NSString *)string andMaxWidth:(CGFloat)maxWidth andMaxHeight:(CGFloat)maxHeight AndFont:(UIFont*)font andLineSpacing:(NSNumber *)lineSpace{
CGSize size = CGSizeZero;
if (IsEmpty(string)) {
return size;
}
if (string && font) {
if ([string respondsToSelector:
@selector(boundingRectWithSize:options:attributes:context:)]) {
NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;
paragraphStyle.alignment = NSTextAlignmentLeft;
if (lineSpace) {
paragraphStyle.lineSpacing = [lineSpace floatValue];
}
size = [string boundingRectWithSize:CGSizeMake(maxWidth, maxHeight)
options:NSStringDrawingUsesLineFragmentOrigin| NSStringDrawingTruncatesLastVisibleLine |NSStringDrawingUsesFontLeading
attributes:@{NSFontAttributeName:font,
NSParagraphStyleAttributeName:paragraphStyle}
context:nil].size; }else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
size = [string sizeWithFont:font
constrainedToSize:CGSizeMake(maxWidth, maxHeight)
lineBreakMode:NSLineBreakByCharWrapping];
#pragma clang diagnostic pop
}
}
if (!CGSizeEqualToSize(CGSizeZero, size)) { CGFloat wight = ceil(maxWidth);
CGFloat height = ceil(size.height ); /**
* 使用 NIAttributedLabel 有个bug ,当文字只有一行或不满一行 会出现文字显示不出来
*/
NSArray *rows = [UILabel getSeparatedLinesWithText:string andFonte:font andSize:size];
if ([rows count]==1) {
CGSize offsetSize = [UILabel getContentSize:string font:font width:maxWidth];
size = CGSizeMake(ceil(offsetSize.width) , ceil(offsetSize.height));
}else{
size = CGSizeMake(wight ,height);
} }
return size;
} #pragma mark - 获取UILable 每行显示的文字 /**
* 获取lalbe 每行文字
*
* @return 每行文字数组
*/
- (NSArray *)getSeparatedLines {
return [self getSeparatedLinesWithText:self.text];
} /**
* 获取lalbe 每行文字
*
* @param text 根据文字内容
*
* @return 每行文字数组
*/
- (NSArray *)getSeparatedLinesWithText:(NSString*)text
{
/**
* fix NSConcreteMutableAttributedString initWithString:: nil value
*/
if (!(text && [text isKindOfClass:[NSString class]])) {
return nil;
} return [UILabel getSeparatedLinesWithText:text andFonte:[self font] andSize:[self frame].size];
} /**
* 获取lalbe 每行文字
*
* @param content 文字内容
* @param fonte fonte description
* @param size size description
*
* @return 每行文字数组
*/
+(NSArray *)getSeparatedLinesWithText:(NSString*)content andFonte:(UIFont *)fonte andSize:(CGSize)size{
if (!(content&&[content isKindOfClass:[NSString class]]) ||
!(fonte&& [fonte isKindOfClass:[UIFont class]]) ||
CGSizeEqualToSize(CGSizeZero, size)) {
return nil;
}
NSString *text = content;
UIFont *font = fonte;
CGRect rect = CGRectMake(0, 0, size.width,size.height); CTFontRef myFont = CTFontCreateWithName((__bridge CFStringRef)([font fontName]), [font pointSize], NULL);
NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:text];
[attStr addAttribute:(NSString *)kCTFontAttributeName value:(__bridge id)myFont range:NSMakeRange(0, attStr.length)]; CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attStr); CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(0,0,rect.size.width,100000)); CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, NULL); NSArray *lines = (__bridge NSArray *)CTFrameGetLines(frame);
NSMutableArray *linesArray = [[NSMutableArray alloc]init]; for (id line in lines)
{
CTLineRef lineRef = (__bridge CTLineRef )line;
CFRange lineRange = CTLineGetStringRange(lineRef);
NSRange range = NSMakeRange(lineRange.location, lineRange.length); NSString *lineString = [text substringWithRange:range];
[linesArray addObject:lineString];
} CFRelease(frameSetter);
CFRelease(myFont);
CFRelease(frame);
CFRelease(path); return (NSArray *)linesArray;
} #pragma mark - 完美解决 向UILable 文字最后插入N张图片,支持向限制行数的UILable 最后一行插入,多余文字显示... /**
* 向文字末尾追加图片,适用于已知Size的UILable
*
* @param contentStr 文字内容
* @param imgs 插入的图片数组, 图片最好带间隔哦
*/
-(void)insertImgToContentLast:(NSString *)contentStr imgs:(NSArray *)imgs{
if (IsEmpty(contentStr) || !imgs || [imgs count] == 0) {
self.text = IsEmpty(contentStr)?@"":contentStr;
return ;
} [self insertImgToContentLast:contentStr imgs:imgs estimateWidth:[self frame].size.width];
}
/**
* 向文字末尾追加图片,适用于AutoLayout 的UILable
*
* @param contentStr 文字内容
* @param imgs 插入的图片数组, 图片最好带间隔哦
* @param estimateWidth 预估的UILable 最大宽度(已知的最大宽度)
*/
-(void)insertImgToContentLast:(NSString *)contentStr imgs:(NSArray *)imgs estimateWidth:(CGFloat)estimateWidth{
if (IsEmpty(contentStr) || !imgs || [imgs count] == 0 || estimateWidth == 0) {
self.text = IsEmpty(contentStr)?@"":contentStr;
return ;
} //获取每行文字需要预设宽度,不然每个字都会是单独的一行
self.width = estimateWidth;
NSArray *textLineArr = [self getSeparatedLinesWithText:contentStr];
NSInteger maxLine = self.numberOfLines; if (maxLine == 0) {
self.text = contentStr;
//追加图片
[self configTitleLableAttributedString:imgs AttributedString:nil];
return;
}
NSInteger lastLineIndex = maxLine - 1; if ([textLineArr count] <= lastLineIndex) {
self.text = contentStr;
//追加图片
[self configTitleLableAttributedString:imgs AttributedString:nil];
return;
} __block CGFloat imgWith = 0.0;
[imgs enumerateObjectsUsingBlock:^(UIImage* img, NSUInteger idx, BOOL * _Nonnull stop) {
imgWith += img.size.width;
}]; CGFloat lastTextMaxWith = estimateWidth - imgWith;
if (lastTextMaxWith <= 0) {
self.text = contentStr;
//追加图片
[self configTitleLableAttributedString:imgs AttributedString:nil];
return ;
} if ([textLineArr count] > lastLineIndex) {
NSMutableString *muShowTitle = [NSMutableString string];
[textLineArr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (idx > (lastLineIndex - 1)) {
//预设宽度
self.width = lastTextMaxWith;
//最大宽带下能显示的字数
NSArray *lastLineArr = [self getSeparatedLinesWithText:textLineArr[lastLineIndex]];
NSString *lastLineText = lastLineArr[0];
// DDLogDebug(@"====lastLineText=======%@==",lastLineText);
if ([lastLineArr count] > 1) {
lastLineText = [lastLineText stringByReplacingCharactersInRange:NSMakeRange(lastLineText.length - 3, 3) withString:@"..."];
}
// DDLogDebug(@"====lastLineArr[0]=======%@==",lastLineText);
[muShowTitle appendString:lastLineText]; * stop = YES;
return ;
}
[muShowTitle appendString:textLineArr[idx]];
}];
self.text = muShowTitle;
// self.width = estimateWidth;
} //追加图片
[self configTitleLableAttributedString:imgs AttributedString:nil];
} /**
* 向已知文字后插入图片
*
* @param insertImgArr insertImgArr description
* @param appendAttributedString 可为nil
*/
-(void)configTitleLableAttributedString:(NSArray *)insertImgArr AttributedString:(NSMutableAttributedString *)appendAttributedString{
if (!insertImgArr || [insertImgArr count] == 0) {
return ;
}
if (!appendAttributedString) {
appendAttributedString = [[NSMutableAttributedString alloc] initWithString:self.text];
} [insertImgArr enumerateObjectsUsingBlock:^(UIImage* img, NSUInteger idx, BOOL * _Nonnull stop) { NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
//带 x 的
textAttachment.image = img; CGFloat mid = self.font.descender + self.font.capHeight;
CGFloat imgY = self.font.descender - textAttachment.image.size.height/2 + mid + 2;
textAttachment.bounds = CGRectMake(0, imgY, textAttachment.image.size.width, textAttachment.image.size.height); NSAttributedString *iconAttributedString = [NSAttributedString attributedStringWithAttachment:textAttachment];
[appendAttributedString replaceCharactersInRange:NSMakeRange(self.text.length, 0) withAttributedString:iconAttributedString];
/**
fix,当文字刚好够一行,添加图片后折行,but.第二行图片和第一行文字没有行间距。。
http://scottzhu.com/blog/2015/02/14/attach-stars-to-the-end-of-a-uilabel/
*/
[appendAttributedString appendAttributedString: [[NSAttributedString alloc] initWithString:@" "]]; }]; self.attributedText = appendAttributedString;
} @end

完美解决 向UILable 文字最后插入N张图片,支持向限制行数的UILable 最后一行插入,多余文字显示...的更多相关文章

  1. 织梦dede如何获取图集调用第一张图片完美解决方法【5.7sp2版本】

    制作产品图集多图效果的时候,常常需要获取图集第一张图片的功能,假设获取的是缩略图,那么缩略图不够大的情况下,第一展示效果就会很差,下面来介绍下如何获取调用织梦图集第一张图片的方法: 首先在 inclu ...

  2. 完美解决移动Web小于12px文字居中的问题

    前几天的一篇博文:移动Web单行文字垂直居中的问题,提到了移动web里小于12px的文字居中异常的问题,最后还是改为12px才近乎解决了问题.但是有时候或许并不是那么乐观,你并不能将原本定为10px的 ...

  3. VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题)

    之前写的一个VC应用程序,是程序启动时就直接出现在任务栏, 窗体不出现,等用户点击任务栏图标再出现窗口.和一些防火墙什么的软件类似. 这种效果实现并不是很困难的,硬是找不到最好的.为什么呢? 首先,在 ...

  4. 完美解决 Phonegap jQeuryMobile 闪屏 问题

    在切换page或者弹出dialog时,会出现闪屏情况,综合网络上各种方法,得出以下方法可完美解决: 1.首先界面页面切换闪屏: 在加载jQuery后,加载jQuery Mobiel之前,插入js语句进 ...

  5. EntityFramework中出现DateTime2异常的完美解决办法

    今天在使用entityframework往数据库插入数据的时候,突然出现了一个数据类型转换异常的问题: System.Data.SqlClient.SqlException: 从 datetime2 ...

  6. input事件在ie9以下不兼容问题完美解决

    上周四好不容易加了几天班把刚接手的一个pc页面做完,周五同事说要兼容ie7~ie9,结果在上面一跑,输入都没法输入. 我的需求是用6个span作为虚拟的密码输入框,实际上是用一个藏在页面里的input ...

  7. 文本分类需要CNN?No!fastText完美解决你的需求(前篇)

    http://blog.csdn.net/weixin_36604953/article/details/78195462?locationNum=8&fps=1 文本分类需要CNN?No!f ...

  8. PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)

    [概览] 1.显示原生Qwidget 1)不使用布局(绝对定位) 2)使用布局 2.显示Qwidget的自定义类 1)不使用布局(绝对定位)       2)使用布局 [知识点] 1.显示原生Qwid ...

  9. 工作总结 EntityFramework中出现DateTime2异常的完美解决办法

    EntityFramework中出现DateTime2异常的完美解决办法   今天在使用entityframework往数据库插入数据的时候,突然出现了一个数据类型转换异常的问题: System.Da ...

随机推荐

  1. Centos添加新硬盘、分区、格式化、自动挂载

    创建分区 #fdisk /dev/hdb 格式化新创建的分区 #mkfs.ext3 /dev/hdb1 使新创建的分区挂载/mnt/data01目录下 #mount /dev/hdb1 /mnt/da ...

  2. 【洛谷P1351】联合权值

    我们枚举中间点,当连的点数不小于2时进行处理 最大值好搞 求和:设中间点 i 所连所有点权之和为sum 则对于每个中间点i的联合权值之和为: w[j]*(sum-w[j])之和 #include< ...

  3. java多条件不定条件查询

    网站或各类管理系统都会用到搜索,会用到一个或多个不确定条件搜索,单条件搜索比较简单,有时候会有多个条件共同查询,如果系统中已经提供了相关的方法供你使用最好,像我做这老系统改版,需要添加搜索,就要自己写 ...

  4. ubuntu 安装pyqt4 eric

    tar xvf eric4-4.5.7.tar.gztar xvf eric4-i18n-zh_CN.GB2312-4.5.7.tar.gzcd eric4-4.5.7/python install. ...

  5. postgresql 配置文件优化

    postgresql 配置文件优化 配置文件 默认的配置配置文件是保存在/etc/postgresql/VERSION/main目录下的postgresql.conf文件 如果想查看参数修改是否生效, ...

  6. iOS 开发UI篇 -- 懒加载学习

    1. 懒加载基本 懒加载--也称为延迟加载,即在需要的时候才加载( 效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实 ...

  7. oracle密码文件管理

    密码文件 密码文件作用: 密码文件用于dba用户的登录认证. dba用户:具备sysdba和sysoper权限的用户,即oracle的sys和system用户. 本地登录: 1)操作系统认证: [or ...

  8. 数据库优化实践【TSQL篇】

    在前面我们介绍了如何正确使用索引,调整索引是见效最快的性能调优方法,但一般而言,调整索引只会提高查询性能.除此之外,我们还可以调整数据访问代码和TSQL,本文就介绍如何以最优的方法重构数据访问代码和T ...

  9. webpy使用笔记(二) session/sessionid的使用

    webpy使用笔记(二) session的使用 webpy使用系列之session的使用,虽然工作中使用的是django,但是自己并不喜欢那种大而全的东西~什么都给你准备好了,自己好像一个机器人一样赶 ...

  10. SONATYPE NEXUS搭建MAVEN私服

    1.为什么使用Nexus如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地,而一个团队中的所有人都重复的从maven仓库下载构件无疑加大了仓库的负载和浪费 ...