【问题标题】:How to get NSString size when NSString includes emojis?当 NSString 包含表情符号时如何获取 NSString 大小?
【发布时间】:2013-04-04 15:16:25
【问题描述】:

我正在使用

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode

获取 NSString 的大小。但是,当该字符串包含表情符号时,它似乎会计算文字 unicode 字符的大小,而不是考虑表情符号本身的大小,从而导致返回的大小不正确。

如何正确获取带有表情符号字符的字符串的大小,因为它会出现在 uilabel 中?

【问题讨论】:

  • 也许您可以给出一个字符串的具体(简短)示例、计算的大小和预期的大小。
  • 我刚刚尝试过混合使用不同的表情符号和罗马字符、不同的字体,而且大小总是正确的......也许问题出在你的 constrainedToSize: 参数上,它太小了包含字符串...
  • 默认情况下,所有表情符号都以固定大小呈现,无论字体大小如何,NSString 和 UIFont 都会完全忽略字体大小。我相信 emoji 字符在 iOS 上总是以大约 20 像素(非视网膜)绘制,因此它们不会与字符串的其余部分一起正确测量。
  • 表情符号实际上有两种尺寸(我认为),小号和大号。然而,在我自己的测试中,NSString 总是给出正确的尺寸...

标签: iphone ios objective-c nsstring emoji


【解决方案1】:

NSString 不呈现表情符号,它代表一个字符串,所以 sizeWithFont 将只考虑字符串。

我会使用:

CGRect labelFrame = label.frame;  
labelFrame.size = [label sizeThatFits:CGSizeMake(100, 9999)];  
[label setFrame:labelFrame]; 

//Alternatively  
[label sizeToFit];

请记住,sizeToFit 调用了 sizeThatFits: 方法,因此就仅将标签设置为正确的高度而言,sizeThatFits: 更快,并且更易于使用。

【讨论】:

【解决方案2】:

我在同一件事上挣扎了一段时间,尝试了多种解决方案,包括接受的答案,但这对我不起作用。我通过使用文本创建一个 NSAttributed String 解决了这个问题,然后使用 NSAttributedString 方法 boundingRectWithSize:options:context: 来获取字符串的大小。

NSString *text = //some text
CGFloat maxSize = //text size constraints

NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:text
                                                                       attributes:@{NSFontAttributeName : font
                                                                                    }];

CGRect boundingRect = [attributedString boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin context:nil];
CGSize fitSize = boundingRect.size;

【讨论】:

    猜你喜欢
    • 2011-02-09
    • 2012-09-11
    • 2012-12-09
    • 2016-12-31
    • 2011-04-19
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多