Как мне заставить - [NSString sizeWithFont: forWidth: lineBreakMode:] работать? - PullRequest
21 голосов
/ 07 января 2009

Я обновил свой вопрос " Определение размера 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. Это похоже на это.

Ответы [ 2 ]

29 голосов
/ 07 января 2009

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

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

7 голосов
/ 03 февраля 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 и т. Д.). См. документы Apple и Command + F для "Точки против пикселей".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...