需求点
经常会有小伙伴遇到这样的需求:无论文字多长,一定要在文字的最后添加一个小图片。
笔者当初遇到这个需求的时候废了好大力气算出了文字的里最后一个字的rect,也就是位置,然后在右面硬生生加上了一个UIImage。结果后来到适配的时候很麻烦。其实实现方案很简单:使用NSAtrributedString!
实现步骤:
- 将文字的
NSString
转化为NSMutableAttributedString
。 - 创建一个图片的
NSTextAttachment
。 - 将
NSMutableAttributedString
与NSTextAttachment
拼接得到新的NSMutableAttributedString
。 - 将新的
NSMutableAttributedString
赋给UILabel
的attributedText
属性即可。
代码实现:
- (NSAttributedString *)attatchImage: (UIImage *)image atLastOfString: (NSString *)string
{
//1.现将内容string转化为NSMutableAttributedString
NSMutableAttributedString *attributedMString = [[NSMutableAttributedString alloc] initWithString:string];
//2.获取图片的NSTextAttachment
NSTextAttachment *attach = [[NSTextAttachment alloc] init];
attach.image = image;
//在这里如果不设置attatchment的bounds,就有可能造成添加的图片的位置高于文字或者大小与文字的大小不统一的情况。不过还是具体问题具体分析,在这里只是告诉各位图片的rect是可以更改的
attach.bounds = CGRectMake(2, -2, 15, 15);
//3.将图片的NSTextAttachment转化为imageString
NSAttributedString *imageString = [NSAttributedString attributedStringWithAttachment:attach];
//4.合并NSMutableAttributedString和imageString
[attributedMString appendAttributedString:imageString];
//5. 将NSMutableAttributedString转化为NSAttributedString并返回
return [[NSAttributedString alloc] initWithAttributedString:attributedMString];
}
作为对比,笔者分别创建了单行和多行的
UILabel
,但是为了不使代码重复,单独写了一个方法来获得在末尾添加了图片的NSAttributedString
,而且通过这个方法,完全不用考虑屏幕适配或者最后一个字在当前行末尾的情况,因为NSAttributedString
会帮我们做好的。
效果图:
如此简单高效的方法真是相见恨晚有木有!
作者:J_Knight_
链接:https://www.jianshu.com/p/fcf6d9b88749
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。