我目前正在使用
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode
获取 NSString 的大小。但是,当该字符串包含表情符号时,它似乎会计算文字 unicode 字符的大小,而不是考虑表情符号本身的大小,从而导致返回的大小不正确。
如何正确获取包含表情符号字符的字符串的大小,因为它将出现在 uilabel 中?
NSString 不呈现表情符号,它代表一个字符串,因此 sizeWithFont 仅考虑字符串。
我会用:
CGRect labelFrame = label.frame;
labelFrame.size = [label sizeThatFits:CGSizeMake(100, 9999)];
[label setFrame:labelFrame];
或
//Alternatively
[label sizeToFit];
请记住
sizeToFit
调用 sizeThatFits:
方法,因此就将标签设置为正确的高度而言, sizeThatFits: 更快,而且更美观。
我在同一件事上挣扎了一段时间,尝试了多种解决方案,包括已接受的答案,但这对我不起作用。我通过使用文本创建 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;
这个解决方案对我有用。有了它,您可以计算字符串大小,而无需创建 UILabel。
let maxWidth = 350.0
let string = "String👌"
let attributedString = NSAttributedString(string: string)
let framesetter = CTFramesetterCreateWithAttributedString(stringToSize)
let size = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRange(location: 0, length: self.string.unicodeScalars.count), nil, CGSize(width: maxWidth, height: CGFloat.infinity), nil)