用NSAttributedString中的图像替换微笑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用NSAttributedString中的图像替换微笑相关的知识,希望对你有一定的参考价值。

我有一个Emoji实体列表,每个都有属性codes,我想检查字符串("]:-)"),如果它包含任何一个,然后用图像替换微笑。

for (Emoji *emoji in self.emojis) {
    for (NSString *code in emoji.codes) {
        NSString *pattern = [NSRegularExpression escapedPatternForString:code];
        NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil];

        NSArray *matches = [regex matchesInString:[sourceString string] options:0 range:NSMakeRange(0, [sourceString length])];

        [matches enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSTextCheckingResult * _Nonnull aResult, NSUInteger idx, BOOL * _Nonnull stop) {
            NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
            [attachment setImage:[UIImage imageNamed:emoji.image]];

            NSAttributedString *replacement = [NSAttributedString attributedStringWithAttachment:attachment];
            [sourceString replaceCharactersInRange:[aResult range] withAttributedString:replacement];
        }];
    }
}

问题是代码]:-)的微笑包含:-)和我的方法替换为下一个:为]括号[image] + :-),这是因为:-)在列表中排名第一。

如何检查确切的字符串?

我试过了:]:-/)\b]:-/)\b/^]:-/)$/

也许有更好的解决方案让这个工作。

答案

如果我理解你当前的结构:

@interface Emoji : NSObject
@property (nonatomic, strong) NSString *image; //I'd expect a UIImage there and not an image name
@property (nonatomic, strong) NSArray *codes;
@end

一种可能的解决方案是使用一对值:imageName / code

@interface Emoji : NSObject
@property (nonatomic, strong) NSString *image; //I'd expect a UIImage there and not an image name
@property (nonatomic, strong) NSString *code;
@end

self.emojis将有大量的Emoji对象,可能具有相同的图像名称用于不同的代码,但这样做的一个好处是这个小技巧: 按照“较小”表情符号结尾的方式对self.emojis进行排序。所以你首先只替换“冗长的”和较小的。

self.emojis = [arrayOfSingleEmojis sortedArrayUsingComparator:^NSComparisonResult(Emoji * _Nonnull emoji1, Emoji * _Nonnull emoji2) {
    NSUInteger length1 = [[emoji1 code] length];
    NSUInteger length2 = [[emoji2 code] length];
    return [@(length2) compare:@(length1)]; //Or reverse length1 & length2, I never know, I always have to test, but I think it's the correct one
}];

所以在你目前的情况下:]:-)将在:-)之前被替换所以你应该有<imageFor:">:-)"]而不是]<imageFor:":-)>

以上是关于用NSAttributedString中的图像替换微笑的主要内容,如果未能解决你的问题,请参考以下文章

用另一个 NSAttributedString 替换 NSAttributedString 的子字符串

NSAttributedString:将图像适合容器

iOS 15 对 NSAttributedString 的图像附件行为不同。如何固定标签的高度?

在 NSAttributedString 中添加图像并保存到 Core Data 性能

UICollectionView 从 NSAttributedString 图像滚动滞后/断断续续

如何使用 Python 用新图像替换图像中的轮廓(矩形)?