Как получить размер NSString, когда NSString включает в себя эмодзи?

Я сейчас пользуюсь

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

чтобы получить размер NSString. Однако, когда эта строка содержит эмодзи, кажется, что она вычисляет размер буквального символа Юникод, а не учитывает размер самого смайлика, что делает возвращаемый размер неверным.

Как правильно получить размер строки с символами эмодзи, как это будет выглядеть в uilabel?

2 ответа

Решение

NSString не представляет смайликов, он представляет строку, поэтому sizeWithFont будет учитывать только строку.

Я хотел бы использовать:

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

или же

//Alternatively  
[label sizeToFit];

Имейте ввиду, что sizeToFit вызывает sizeThatFits: метод, так что с точки зрения просто установки метки на нужную высоту sizeThatFits: быстрее и намного проще для глаз.

Некоторое время я боролся с тем же, пытаясь найти несколько решений, включая принятый ответ, который мне не помог. Я решил это путем создания строки NSAttributed с текстом, а затем с помощью метода 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;
Другие вопросы по тегам