2009-08-20 6 views
3

Всякий раз, когда в тексте присутствует &, получение высоты кажется выключенным все время. Обе функции возвращают меньше, чем фактическая высота:sizeWithFont - странное поведение при наличии символа &

CGSize labelSize = [nameLabel.text sizeWithFont:nameLabel.font constrainedToSize: CGSizeMake(actualWidth, MAXFLOAT) lineBreakMode:UILineBreakModeWordWrap]; 

CGRect textSize = CGRectMake(0.0, 0.0, 320.0, FLT_MAX); 
nameLabel.frame = [nameLabel textRectForBounds:textSize limitedToNumberOfLines:0]; 

Ни один из них не будет возвращать правильную высоту, хотя второй метод, использующий textRectForBounds возвращает гораздо ближе фактическую высоту. Первый вернет 240, а позже вернет 700. Фактически это 750.

Это испортит мой UITableView, показывая тексты, которые перекрываются друг с другом.

Интересно, что вернул бы ту же высоту, пока текст не содержит символов &.

Может кто-нибудь просветить меня, пожалуйста, что касается меня жизни, я не понимаю, что здесь происходит, и знаю, как правильно это исправить.

Большое спасибо.

+0

для вашего первого примера, что означает ограничение max и min? – Daniel

ответ

2

-textRectForBounds:limitedToNumberOfLines: не следует вызывать непосредственно (обратите внимание на docs). Поэтому не обязательно быть верным. Он также указывает, что «метки в объектах UITableViewCell имеют размер, основанный на размерах ячеек, а не на запрошенном размере».

Я подозреваю, что actualWidth в вашем телефоне sizeWithFont:constrainedToSize:lineBreakMode: шире, чем вы ожидаете, так что линия фактически не обертывается. Как вы рассчитываете actualWidth?

Возможно, вы захотите заменить это на sizeWithFont:forWidth:lineBreakMode:, который специально предназначен для того, что вы пытаетесь сделать. Тем не менее, это может быть просто обертка вокруг звонка, который вы делаете.

1

У меня была такая же проблема. Я закончил тем, что избежал символа & и изменил его на &, и все сработало нормально. UILabel был достаточно умен, чтобы правильно отобразить экранированный &, и размер был правильно рассчитан.