在Objective-C中计算具有不同语言和表情符号的文本的UILabel高度

Cod*_*key 10 objective-c uilabel ios emoji

我需要计算可能是英语/表情符号/其他语言的给定文本的帧大小.
我这样做的方式是:

  NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
[style setLineBreakMode:NSLineBreakByWordWrapping];
NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:fontSize], NSParagraphStyleAttributeName: style};
CGSize rect = [text boundingRectWithSize:CGSizeMake(containerWidth, CGFLOAT_MAX)
                               options:NSStringDrawingUsesLineFragmentOrigin| NSStringDrawingUsesFontLeading
                            attributes:attributes
                               context:nil].size;
Run Code Online (Sandbox Code Playgroud)

只要我不使用表情符号,它就可以正常工作.表情符号线高度/字体大小似乎与普通字体不同.

我看到人们尝试用不同的方式解决它,例如:http: //youbbe.xyz/issue/4987325/ios-emoji-messed-up-in-uilabel

此解决方案适用于表情符号,但不适用于英语/其他字体.

见示例图片:
在此输入图像描述 如您所见,只计算文本(第一个框),但文本+表情符号未正确计算(第二个框).

我真的很惊讶这个问题没有简单的解决办法.非常感谢您的帮助.

bey*_*ulf 4

使用 UILabel 你可以简单地说:

CGSize size = [label sizeThatFits:CGSizeMake(containerWidth, CGFLOAT_MAX)];
Run Code Online (Sandbox Code Playgroud)

你试过这个吗?我不认为表情符号有不同的行高,但它们通常占据整个行高。

您可以直接说出[label sizeToFit];然后从框架中获取尺寸(例如CGSize size = label.frame.size;)。这似乎是为不同字体大小获取正确大小的最一致准确的方法。

这里有一些代码,您可以将其复制并粘贴到游乐场中并查看不同的结果。