代码之家  ›  专栏  ›  技术社区  ›  landonandrey

用nsattributestring中的图像替换微笑

  •  -1
  • landonandrey  · 技术社区  · 6 年前

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

    问题是,用代码微笑 ]:-) 包含 :-) 我的方法是用next替换它: 支架 ] + [image] 对于 :-) :-) 排在第一位。

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

    也许有更好的解决办法让它发挥作用。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Larme    6 年前

    如果我正确理解你目前的结构:

    @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
    

    @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 = [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:":-)>