我正在使用开源UILabel子类STTweetLabel v2.22
(Github)并尝试在标签中显示表情符号。在我的测试期间,似乎代码可以正确处理大多数情况,但有时我会看到:
只是想知道为什么会发生这种情况,以及可能需要解决的问题......
谢谢!
- 更新(添加用于解码服务器字符串的代码) -
NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
NSString *decoded = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding];
答案 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
?这毫无意义。
此处还有其他事情发生。