gpt4 book ai didi

ios - 使用 NSAttributedString 添加后如何从 UITextView 检索照片?

转载 作者:可可西里 更新时间:2023-11-01 03:32:55 26 4
gpt4 key购买 nike

我正在使用下一个代码将图像添加到 UITextView:

    UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(200,200,140,140)];
textView.font = [UIFont systemFontOfSize:20.0f];
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"Test with emoji"];
NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
textAttachment.image = [UIImage imageNamed:@"Angel.png"];

//for the padding inside the textView
textAttachment.image = [UIImage imageWithCGImage:textAttachment.image.CGImage scale:3.0 orientation:UIImageOrientationUp];
NSAttributedString *attrStringWithImage = [NSAttributedString attributedStringWithAttachment:textAttachment];
[attributedString replaceCharactersInRange:NSMakeRange(5, 1) withAttributedString:attrStringWithImage];
[attributedString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:17] range:NSMakeRange(0, attributedString.length)];
textView.attributedText = attributedString;
NSLog(@"Text view: %@", textView.attributedText);

[self.view addSubview:textView];

结果是这样的:

enter image description here

我感兴趣的是,我怎么知道在文本字段和女巫位置插入了什么图片?我正在考虑使用 attributedText,正如您在代码中看到的那样,因为它记录了:

Text view: Test {
NSFont = "<UICTFont: 0x7ff0324f2110> font-family: \".HelveticaNeueInterface-Regular\"; font-weight: normal; font-style: normal; font-size: 17.00pt";
}{
NSAttachment = "<NSTextAttachment: 0x7ff032682bc0>";
NSFont = "<UICTFont: 0x7ff0324f2110> font-family: \".HelveticaNeueInterface-Regular\"; font-weight: normal; font-style: normal; font-size: 17.00pt";
}with emoji{
NSFont = "<UICTFont: 0x7ff0324f2110> font-family: \".HelveticaNeueInterface-Regular\"; font-weight: normal; font-style: normal; font-size: 17.00pt";
}

更新

使用代码检索图像:

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];
}
}];

但如果 attributedString 包含超过 1 张连续照片怎么办?示例:

  • 如果字符串包含两张连续的照片,则只将一张添加到数组中看起来如何

enter image description here

代码

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"Test   with emoji "];
[attributedString replaceCharactersInRange:NSMakeRange(4, 1) withAttributedString:attrStringWithImage];
[attributedString replaceCharactersInRange:NSMakeRange(5, 1) withAttributedString:attrStringWithImage];

日志:

Image array: (
"<UIImage: 0x7fd4e3e56760>"
)
  • 如果照片不连续,则将它们都正确添加到数组中看起来如何

enter image description here

代码

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"Test  with emoji "];
[attributedString replaceCharactersInRange:NSMakeRange(4, 1) withAttributedString:attrStringWithImage];
[attributedString replaceCharactersInRange:NSMakeRange(16, 1) withAttributedString:attrStringWithImage];

日志

Image array: (
"<UIImage: 0x7f9ce35a4a70>",
"<UIImage: 0x7f9ce35a4a70>"
)

那么,我正在做的事情或 enumerateAttribute 方法是否存在错误?

更新 2如果我为我添加的每张照片创建一个新的 textAttachmentattrStringWithImage 实例,就设法解决了这个问题。

最佳答案

检索图像的解释here .

你的新问题是,如果两个图像是连续的并且相同。

所以代替:

if (image)
[imagesArray addObject:image];

您需要进行其他检查,这将对两张图片执行此操作,但您无法知道它们是否连续。

if (image)
{
if ([imagesArray lastObject] != image)
[imagesArray addObject:image];
}

因此您还需要保留 NSRange 的引用。

if (image)
{
if ([imagesArray count] > 0)
{
NSDictionary *lastFound = [imagesArray lastObject];
NSRange lastRange = [lastFound[@"range"] rangeValue];
UIImage *lastImage = lastFound[@"image"];
if (lastImage == image && lastRange.location+lastRange.length == range.location)
{ //Two images same & consecutive}
else
{
[imagesArray addObject:@{@"image":image, @"range":[NSValue valueWithRange:range]}];
}
}
else
{
[imagesArray addObject:@{@"image":image, @"range":[NSValue valueWithRange:range]}];
}
}

只检索图像:

NSArray *onlyImages = [imagesArray valueForKey:@"image"];

注意:我没有检查这段代码是否编译,但你应该明白了整个想法。我的范围计算可能是错误的(一些 +1/-1 丢失,但不难通过测试验证),如果两个相同的连续图像之间有空间怎么办?您可能希望在 (NSString *stringBetween = [[attributedString string] substringWithRange:NSMakeRange(lastRange.location+lastRange.length, range.location-lastRange.location+lastRange.length)] 之间获取字符串 , 并检查空格、标点字符(有很多方法可以做到这一点)。

补充说明:在您的情况下,只需比较 image != newImage 可能就足够了,但是如果您使用网络图像,或者甚至在您的包中使用两个名称不同但相同的图像,那么知道它们是否是另一个问题是相同的。 SO 上有几个关于比较两个图像的问题,但这需要一些时间/资源。

关于ios - 使用 NSAttributedString 添加后如何从 UITextView 检索照片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30169162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com