在NSAttributedString中为所有表情符号添加属性?

时间:2015-06-21 13:08:26

标签: ios uilabel nsattributedstring emoji

我在我的iOS应用程序中使用的字体有一个令人遗憾的质量:它的字符非常小,因此,如果用户键入包含表情符号的字符串(或者可能是字体中未包含的其他字符?尚未测试过),当iOS在AppleColorEmoji字体中绘制这些字形时,它们相对于其他字形显得比较大。

这当然很复杂,因为表情符号是“两部分”的字形,所以我不能只做一个简单的for-each-in-the-string循环。

我需要的是一种方法  -(NSAttributedString *)attributedStringByAddingAttributes:(NSArray *)attrs toString:(NSString*)myString forCharactersNotInFont:(UIFont *)font

......或者至少失败了 -(NSAttributedString *)attributedStringByAddingAttributes:(NSArray *)attrs toStringForEmoji:(NSString*)myString

......或其他什么。

不确定最佳方法。

1 个答案:

答案 0 :(得分:0)

代码我最终使用的代码改编自here

- (BOOL)isEmoji:(NSString *)str {
    const unichar high = [str characterAtIndex: 0];

    // Surrogate pair (U+1D000-1F77F)
    if (0xd800 <= high && high <= 0xdbff) {
        const unichar low = [str characterAtIndex: 1];
        const int codepoint = ((high - 0xd800) * 0x400) + (low - 0xdc00) + 0x10000;

        return (0x1d000 <= codepoint && codepoint <= 0x1f77f);

        // Not surrogate pair (U+2100-27BF)
    } else {
        return (0x2100 <= high && high <= 0x27bf);
    }
}

// The following takes a string s and returns an attributed string where all the "special characters" contain the provided attributes

- (NSAttributedString *)attributedStringForString:(NSString *)s withAttributesForEmoji:(NSDictionary *)attrs {

    NSMutableAttributedString *as = [[NSMutableAttributedString alloc] initWithString:@""];

    NSRange fullRange = NSMakeRange(0, [s length]);

    [s enumerateSubstringsInRange:fullRange
                          options:NSStringEnumerationByComposedCharacterSequences
                       usingBlock:^(NSString *substring, NSRange substringRange,
                                    NSRange enclosingRange, BOOL *stop)
    {
        if ([self isEmoji:substring]) {
            [as appendAttributedString:[[NSAttributedString alloc] initWithString:substring
                                                                       attributes:attrs]];
        } else {
            [as appendAttributedString:[[NSAttributedString alloc] initWithString:substring]];
        }
    }];
    return as;
}

到目前为止,似乎工作得非常好!