日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/5/22 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 完美解决 向UILable 文字最后插入N张图片,支持向限制行数的UILable 最后一行插入,多余文字显示...... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

效果:

?

?

====直接上代碼吧===

// // 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:sizeoptions:\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

?

轉載于:https://www.cnblogs.com/DamonTang/p/5344048.html

總結

以上是生活随笔為你收集整理的完美解决 向UILable 文字最后插入N张图片,支持向限制行数的UILable 最后一行插入,多余文字显示......的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产一区二区视频免费在线观看 | 欧美三级日本三级 | av黄在线| 中文字幕一区二区三区四区五区 | 精品欧美一区二区精品久久 | 免费在线观看污 | 久久久777 | 久久久久亚洲av成人网人人软件 | 在线免费观看不卡av | 草莓视频一区二区三区 | 91久久婷婷 | 李宗瑞91在线正在播放 | 欧美大喷水吹潮合集在线观看 | 午夜毛片视频 | 国产黄色一区二区 | 总裁边开会边做小娇妻h | 污视频网站在线播放 | 在线观看黄色片 | 加勒比成人在线 | 天天看夜夜操 | 国产一区黄色 | 99产精品成人啪免费网站 | 一级黄色片免费在线观看 | 九九黄色大片 | 理论在线视频 | 久久国产视频一区 | 四虎影院成人 | 日本不卡视频在线观看 | 日本激情电影 | 成人动漫在线观看免费 | 亚洲av人无码激艳猛片服务器 | 中文字幕第三页 | 免费看欧美一级特黄a大片 国产免费的av | 免费人成视频在线 | 男人舔女人下部高潮全视频 | 艳妇臀荡乳欲伦交换在线播放 | 丁香八月婷婷 | 东方伊甸园av在线 | 日韩在线观看视频免费 | 成人久久久精品乱码一区二区三区 | 国产极品视频在线观看 | 亚洲黄色大片 | 色偷偷在线观看 | 三级在线观看网站 | 国产一级啪啪 | 国产男人搡女人免费视频 | 好男人www | 亚洲国产综合一区 | 中文字幕av在线播放 | 无套内谢的新婚少妇国语播放 | 午夜精品在线 | 午夜在线不卡 | 三级在线网址 | 欧美黑人一级爽快片淫片高清 | 久久国产精品无码一级毛片 | 在线视频一二区 | 91动态图 | 欧美一级视频在线观看 | 九久久久久 | 中文字幕+乱码+中文乱码www | 久久久国产精华液999999 | 欧美在线天堂 | 手机看片日韩日韩 | 性猛交xxxx乱大交3 | a一级黄色 | 亚洲一区二区av在线 | 丰满少妇一区二区三区 | 国产男同gay网站 | 精品国产人妻一区二区三区 | 高清成人免费视频 | 视频h在线 | 国产主播在线看 | 国产精品福利一区二区 | 欧美黄色片免费看 | 国产免费无码一区二区视频 | 国产h片在线观看 | 亚洲福利天堂 | 久久大胆视频 | 三级免费看 | ass精品国模裸体pics | 亚洲毛片一级 | 熟女少妇一区二区 | 国产成人无码精品久久二区三 | a毛片网站 | 色干综合 | 国产白丝袜美女久久久久 | xx视频在线| 欧美女优在线 | 国产成人无码久久久精品天美传媒 | 韩国美女一区 | 国产人妻aⅴ色偷 | av播播 | 国产亚洲一区二区三区在线观看 | caoporn成人| 一区二区三区视频 | 青青视频网 | 欧美性网站 | 国产精品suv一区二区 | 成人福利在线 |