Как мне получить - [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 для "Точки против пикселов".