Как мне заставить - [NSString sizeWithFont: forWidth: lineBreakMode:] работать?

Я обновил свой вопрос «Определение размера UILabel (в iPhone SDK) подходит? "с описанием моей проблемы с предложенным решением, но не получил ответа. Возможно, у меня будут лучшие результаты, если я задам новый вопрос ...

Я установил точку останова после следующего кода:

NSString *theText = @"When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature's God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation.";
CGSize theSize = [theText sizeWithFont:[UIFont systemFontOfSize:17.0f] forWidth:260.0 lineBreakMode:UILineBreakModeWordWrap];

theSize.height 21 и theSize.width 231. Что я делаю не так? Эта высота не может быть ни в пикселях, ни в количестве строк.

Обратите внимание, что [UIFont systemFontOfSize:17.0f] предназначен для указания шрифта по умолчанию.

Обновление: я изменил код на:

CGSize constraintSize;
constraintSize.width = 260.0f;
constraintSize.height = MAXFLOAT;
NSString *theText = @"When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature's God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation.";
CGSize theSize = [theText sizeWithFont:[UIFont systemFontOfSize:17.0f] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

theSize.height - 273. Это больше похоже на это.


person Daryl Spitzer    schedule 07.01.2009    source источник
comment
У меня был точно такой же результат: 21. Кто-нибудь знает, откуда взялось это число, или оно основано только на этом размере шрифта. Глупый метод.   -  person ZaBlanc    schedule 08.10.2011
comment
Если вы используете UITextView, взгляните на мой ответ здесь: stackoverflow.com/questions/2330939/   -  person domsom    schedule 14.03.2013


Ответы (2)


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

Попробуйте использовать sizeWithFont:constrainedToSize: и просто укажите MAXFLOAT как компонент высоты размера.

person Lily Ballard    schedule 07.01.2009
comment
Если текст достаточно длинный, создание представления с максимальной высотой MAXFLOAT приведет к сбою приложения. - person Alex Salom; 03.09.2012

Любой, кто ломал голову над этим, узнает, что метод назван неправильно и довольно несовместим с тем, что вы ожидаете (это нарушение хорошего дизайна API, но, как знает любой опытный разработчик: API Apple плохо спроектирован, извините, ребята). Стоит прочитать: презентация Джоша Блоха о хорошем дизайне API.

Я бы сказал, что они должны переименовать его (если он должен быть сохранен) и сделать его полезным, чтобы вы не использовали обычную практику передачи CGSize с размером, который, как вы знаете, слишком велик.

[someString sizeWithFont:yourFont 
       constrainedToSize:CGSizeMake(maxWidthYouSpecify, self.frame.size.height)  
           lineBreakMode:UILineBreakModeWordWrap];

В качестве альтернативы это будет работать так же:

[someString sizeWithFont:yourFont 
       constrainedToSize:CGSizeMake(maxWidthYouSpecify, CGFLOAT_MAX)
           lineBreakMode:UILineBreakModeWordWrap];

Возможно, так и должна работать функция. (FWIW, CGFLOAT_MAX определяется в CGGeometry )

Отступление в сторону, но довольно важное: вся Core Graphics работает с точками, а не с пикселями.

Одна точка не обязательно соответствует одному пикселю на экране.

Это важное различие, которое вам необходимо понимать при работе с разными разрешениями (iPhone 3GS, 4, iPad и т. Д.). См. документы и Command + от Apple. F для «точек против пикселей».

person Matt Weaver    schedule 03.02.2012