iOS表情符号在UILabel中搞砸了

时间:2014-08-04 22:36:38

标签: ios objective-c unicode encoding emoji

我正在使用开源UILabel子类STTweetLabel v2.22Github)并尝试在标签中显示表情符号。在我的测试期间,似乎代码可以正确处理大多数情况,但有时我会看到:

enter image description here

只是想知道为什么会发生这种情况,以及可能需要解决的问题......

谢谢!

- 更新(添加用于解码服务器字符串的代码) -

 NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
 NSString *decoded = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding];

2 个答案:

答案 0 :(得分:2)

您好我有一个解决方案,您可以找到表情符号的高度。 请使用<CoreText/CoreText.h>框架并使用以下代码。

  - (CGFloat)heightStringWithEmojis:(NSString*)str fontType:(UIFont *)uiFont ForWidth:(CGFloat)width {

    // Get text
    CFMutableAttributedStringRef attrString = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0);
    CFAttributedStringReplaceString (attrString, CFRangeMake(0, 0), (CFStringRef) str );
    CFIndex stringLength = CFStringGetLength((CFStringRef) attrString);

    // Change font
    CTFontRef ctFont = CTFontCreateWithName((__bridge CFStringRef) uiFont.fontName, uiFont.pointSize, NULL);
    CFAttributedStringSetAttribute(attrString, CFRangeMake(0, stringLength), kCTFontAttributeName, ctFont);

    // Calc the size
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString);
    CFRange fitRange;
    CGSize frameSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0, 0), NULL, CGSizeMake(width, CGFLOAT_MAX), &fitRange);

    CFRelease(ctFont);
    CFRelease(framesetter);
    CFRelease(attrString);

    return frameSize.height +4;

}

让我知道想法...... !!!

答案 1 :(得分:0)

有几件事:

不要使用encoding:NSNonLossyASCIIStringEncoding,表情符号不是ASCII。使用NSUTF8StringEncoding

为什么要转换为NSData然后转换回NSString?这毫无意义。

此处还有其他事情发生。