从 NSAttributedString 中提取图像
Extract UIImage from NSAttributed String
我正在做的是:
- NSATTRIBUTE 字符串 = NSSTRING + UIMAGE 的;
- NSDATA = NSATTRIBUTED 字符串;
- 我还可以将 nsdata 转换为 nsattributed 字符串
- NSATTRIBUTED 字符串 = NSDATA:
- 然后从 NSAttributed 字符串中提取嵌套
- NSSTRING = [NSATTRIBUTED STRING 字符串];
查询:
如何从 NSATTRIBUTED STRING 中获取图像;
- UIIMAGE = 来自 NSATTRIBUTED 字符串;
- ARRAYOFIMAGE = 来自 NSATTRIBUTED 字符串;
您必须枚举 NSAttributedString
以查找 NSTextAttachment
。
NSMutableArray *imagesArray = [[NSMutableArray alloc] init];
[attributedString enumerateAttribute:NSAttachmentAttributeName
inRange:NSMakeRange(0, [attributedString length])
options:0
usingBlock:^(id value, NSRange range, BOOL *stop)
{
if ([value isKindOfClass:[NSTextAttachment class]])
{
NSTextAttachment *attachment = (NSTextAttachment *)value;
UIImage *image = nil;
if ([attachment image])
image = [attachment image];
else
image = [attachment imageForBounds:[attachment bounds]
textContainer:nil
characterIndex:range.location];
if (image)
[imagesArray addObject:image];
}
}];
如您所见,有测试if ([attachment image])
。那是因为看起来如果你创建了 NSTextAttachment
来放置 NSAttachmentAttributeName
它就会存在并且你的图像也会在那里。但是,如果您使用例如来自网络的图像并将其从 HTML 代码转换为 NSTextAttachment
,则 [attachment image]
将为零并且您将无法获取图像.
您可以看到在此代码段中使用断点(设置真实图像 URL 和来自 bundle.xml 的真实图像名称)。
NSString *htmlString = @"http://anImageURL\">Blahttp://anOtherImageURL\"> 测试 retest";
NSError *error;
NSAttributedString *attributedStringFromHTML = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding]
options:@{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,
NSCharacterEncodingDocumentAttribute:@(NSUTF8StringEncoding)}
documentAttributes:nil
error:&error];
NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
[textAttachment setImage:[UIImage imageNamed:@"anImageNameFromYourBundle"]];
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:attributedStringFromHTML];
[attributedString appendAttributedString:[NSAttributedString attributedStringWithAttachment:textAttachment]];
在 Swift 3 中:(相当于 macOS )
func textViewDidChange(_ textView: UITextView) {
// other code...
let range = NSRange(location: 0, length: textView.attributedText.length)
if (textView.textStorage.containsAttachments(in: range)) {
let attrString = textView.attributedText
var location = 0
while location < range.length {
var r = NSRange()
let attrDictionary = attrString?.attributes(at: location, effectiveRange: &r)
if attrDictionary != nil {
// Swift.print(attrDictionary!)
let attachment = attrDictionary![NSAttachmentAttributeName] as? NSTextAttachment
if attachment != nil {
if attachment!.image != nil {
// your code to use attachment!.image as appropriate
}
}
location += r.length
}
}
}
}
我将代码 Larme 转换为 swift 3
var imagesArray = [Any]()
textView.attributedText.enumerateAttribute(NSAttachmentAttributeName, in: NSRange(location: 0, length: textView.attributedText.length), options: [], using: {(value,range,stop) -> Void in
if (value is NSTextAttachment) {
let attachment: NSTextAttachment? = (value as? NSTextAttachment)
var image: UIImage? = nil
if ((attachment?.image) != nil) {
image = attachment?.image
} else {
image = attachment?.image(forBounds: (attachment?.bounds)!, textContainer: nil, characterIndex: range.location)
}
if image != nil {
imagesArray.append(image)
}
}
})
我正在做的是:
- NSATTRIBUTE 字符串 = NSSTRING + UIMAGE 的;
- NSDATA = NSATTRIBUTED 字符串;
- 我还可以将 nsdata 转换为 nsattributed 字符串
- NSATTRIBUTED 字符串 = NSDATA:
- 然后从 NSAttributed 字符串中提取嵌套
- NSSTRING = [NSATTRIBUTED STRING 字符串];
查询:
如何从 NSATTRIBUTED STRING 中获取图像;
- UIIMAGE = 来自 NSATTRIBUTED 字符串;
- ARRAYOFIMAGE = 来自 NSATTRIBUTED 字符串;
您必须枚举 NSAttributedString
以查找 NSTextAttachment
。
NSMutableArray *imagesArray = [[NSMutableArray alloc] init];
[attributedString enumerateAttribute:NSAttachmentAttributeName
inRange:NSMakeRange(0, [attributedString length])
options:0
usingBlock:^(id value, NSRange range, BOOL *stop)
{
if ([value isKindOfClass:[NSTextAttachment class]])
{
NSTextAttachment *attachment = (NSTextAttachment *)value;
UIImage *image = nil;
if ([attachment image])
image = [attachment image];
else
image = [attachment imageForBounds:[attachment bounds]
textContainer:nil
characterIndex:range.location];
if (image)
[imagesArray addObject:image];
}
}];
如您所见,有测试if ([attachment image])
。那是因为看起来如果你创建了 NSTextAttachment
来放置 NSAttachmentAttributeName
它就会存在并且你的图像也会在那里。但是,如果您使用例如来自网络的图像并将其从 HTML 代码转换为 NSTextAttachment
,则 [attachment image]
将为零并且您将无法获取图像.
您可以看到在此代码段中使用断点(设置真实图像 URL 和来自 bundle.xml 的真实图像名称)。 NSString *htmlString = @"http://anImageURL\">Blahttp://anOtherImageURL\"> 测试 retest";
NSError *error;
NSAttributedString *attributedStringFromHTML = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding]
options:@{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,
NSCharacterEncodingDocumentAttribute:@(NSUTF8StringEncoding)}
documentAttributes:nil
error:&error];
NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
[textAttachment setImage:[UIImage imageNamed:@"anImageNameFromYourBundle"]];
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:attributedStringFromHTML];
[attributedString appendAttributedString:[NSAttributedString attributedStringWithAttachment:textAttachment]];
在 Swift 3 中:(相当于 macOS
func textViewDidChange(_ textView: UITextView) {
// other code...
let range = NSRange(location: 0, length: textView.attributedText.length)
if (textView.textStorage.containsAttachments(in: range)) {
let attrString = textView.attributedText
var location = 0
while location < range.length {
var r = NSRange()
let attrDictionary = attrString?.attributes(at: location, effectiveRange: &r)
if attrDictionary != nil {
// Swift.print(attrDictionary!)
let attachment = attrDictionary![NSAttachmentAttributeName] as? NSTextAttachment
if attachment != nil {
if attachment!.image != nil {
// your code to use attachment!.image as appropriate
}
}
location += r.length
}
}
}
}
我将代码 Larme 转换为 swift 3
var imagesArray = [Any]()
textView.attributedText.enumerateAttribute(NSAttachmentAttributeName, in: NSRange(location: 0, length: textView.attributedText.length), options: [], using: {(value,range,stop) -> Void in
if (value is NSTextAttachment) {
let attachment: NSTextAttachment? = (value as? NSTextAttachment)
var image: UIImage? = nil
if ((attachment?.image) != nil) {
image = attachment?.image
} else {
image = attachment?.image(forBounds: (attachment?.bounds)!, textContainer: nil, characterIndex: range.location)
}
if image != nil {
imagesArray.append(image)
}
}
})