Как мне получить - [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 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 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. Это похоже на это.

Ответ 1

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

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

Ответ 2

Как узнал кто-то, кто искал это, метод неправильно назван и скорее несовместим с тем, что вы ожидаете (что нарушает хороший дизайн API, но, как знает любой опытный разработчик: Apple API не очень хорошо спроектирован, извините ребята). Стоит прочитать: Презентация Джоша Блоха по хорошему дизайну 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 и т.д.). См. Apple docs и Command + F для "Точки против пикселов".