我在我的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
......或其他什么。
不确定最佳方法。
答案 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;
}
到目前为止,似乎工作得非常好!