实现图文混排效果的展示,这样我们就会用到这两个类:NSTextAttachment、NSMutableAttributedString。
NSTextAttachment是iOS7新增的类,作为文本的附件,可以放文件,可以放数据,所以是图文混编实现的一个重要的类
//可以将需要显示的图片赋值给这个属性.
@property(nullable, strong, NS_NONATOMIC_IOSONLY) UIImage *image
//可以设置显示的图片大小.
@property(NS_NONATOMIC_IOSONLY) CGRect bounds
NSMutableAttributedString是继承于NSAttributedString,这个类是一个主要可以对文字的颜色、下划线等诸多属性进行修改的字符串类.他是实现富文本的一种方式.
常见的属性及说明
NSFontAttributeName 字体
NSParagraphStyleAttributeName 段落格式
NSForegroundColorAttributeName 字体颜色
NSBackgroundColorAttributeName 背景颜色
NSStrikethroughStyleAttributeName删除线格式
NSUnderlineStyleAttributeName 下划线格式
NSStrokeColorAttributeName 删除线颜色
NSStrokeWidthAttributeName删除线宽度
NSShadowAttributeName 阴影
对象方法以及解释说明
// 对这一范围内文字设置多个属性
- (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range;
// 对这一范围内文字添加某个属性
- (void)addAttribute:(NSString *)name value:(id)value range:(NSRange)range;
// 对这一围内文字添加多个属性
- (void)addAttributes:(NSDictionary *)attrs range:(NSRange)range;
// 移除这个范围内的某个属性
- (void)removeAttribute:(NSString *)name range:(NSRange)range;
还有一个比较重要的方法(这是NSAttributedString类别中的方法)
+ (NSAttributedString *)attributedStringWithAttachment:(NSTextAttachment *)attachment NS_AVAILABLE(10_0, 7_0);
1.首先创建一个NSTextAttachment对象,对其image属性进行赋值。
NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
attachment.image = [UIImage imageNamed:@"imageName"];
2.用 attributedStringWithAttachment:
方法将attachment对象转换成属性字符串,以便之后将图片显示在文本中。
NSMutableAttributedString *attachmentString = (NSMutableAttributedString *)[NSAttributedString attributedStringWithAttachment:attachment];
3.将图片插入文本
如果将图片插入文本末尾可以用appendAttributedString:
这个方法
[self.textView.textStorage appendAttributedString:attachmentString];
如果将图片插入光标位置话,可以用 insertAttributedString: atIndex:
这个方法
[self.textView.textStorage insertAttributedString:attachmentString atIndex:self.textView.selectedRange.location];
4.图片的显示默认是按照原大小进行渲染,如果对图像大小有要求,需要调整图像大小的话,可以有两种方法。
- 第一种:就是直接使用NSTextAttachment的bounds属性进行设置。
- 第二种:可以创建一个NSTextAttachment的子类,然后实现NSTextAttachmentContainer协议的这个方法
- (CGRect)attachmentBoundsForTextContainer:(NSTextContainer *)textContainer proposedLineFragment:(CGRect)lineFrag glyphPosition:(CGPoint)position characterIndex:(NSUInteger)charIndex;
这个方法会返回一个attachment的CGRect,如果需要调整attachment的大小,可以在这里面进行,也可以在里面限制attachment的大小
5.对于UITextView中的图片,如果想要点击效果的话,可以实现UITextViewDelegate这个协议里面的方法
- (BOOL)textView:(UITextView *)textView shouldInteractWithTextAttachment:(NSTextAttachment *)textAttachment inRange:(NSRange)characterRange;
具体的点击效果可以写在上面这个方法中,最后的返回值为YES,则图片可以被复制、保存,返回值NO则不能,但是都不会影响返回之前的其他操作