Подтвердить что ты не робот

Что такое [NSString sizeWithFont: forWidth: lineBreakMode:] хорошо для?

В моем вопросе Как мне получить -[NSString sizeWithFont:forWidth:lineBreakMode:] для работы?", я узнал, что -[NSString sizeWithFont:constrainedToSize:lineBreakMode:] на самом деле был тем, что мне нужно.

Документация для состояний -[NSString sizeWithFont:forWidth:lineBreakMode:] объясняет, что на самом деле она не переносит текст на дополнительные строки. Так как я буду использовать его? (Примеры помогут.)

4b9b3361

Ответ 1

Он отлично подходит для многострочных строк.

В основном это функция, которая позволяет вам увидеть, насколько велика будет строка при визуализации с помощью режима шрифта и прерывания строки.

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

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

Я использую этот метод для этого.

И пример того, как я буду использовать его для этого, заключается в следующем:

//Calculate the expected size based on the font and linebreak mode of your label
CGSize maximumLabelSize = CGSizeMake(296,9999);

CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font 
                        constrainedToSize:maximumLabelSize 
                        lineBreakMode:yourLabel.lineBreakMode]; 

//adjust the label the the new height.
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;

Вы указываете, насколько велика область, в которую вы должны поместить текст, а затем этот метод сообщает вам, сколько места он займет (обертывание по мере необходимости). Также, если строка будет переполнять границы прямоугольника, который вы предоставляете, вы можете сказать, а затем решили, как отображать текст.

Ссылка на него не на самом деле обертывает текст, потому что этот метод на самом деле ничего не делает для текста. Он просто практически выдает его и возвращает, насколько большой участок, в котором он должен был бы действительно выложить его.

его ответственность за ярлык (или какой-либо контейнер, который вы используете для текста) для выполнения обертывания/того, что еще нужно сделать.

Надеюсь, что это поможет.

Крис.

Ответ 2

Некоторое время я думал, что эта процедура просто сломана. Похоже, это идеальная рутина для разработки того, как высокий фрагмент текста, когда он обернут определенной шириной. Однако это не то, что он делает. Действительно, возвращаемая высота всегда является одной строкой. (Что бессмысленно, кстати: UIFont -leading возвращает то же значение.)

Чтобы процитировать документацию на момент написания:

Хотя он вычисляет разрывы строк, этот метод фактически не переносит текст на дополнительные строки; [...]

Это предложение смутило меня в течение длительного времени. Мои мысли шли по строкам:

  • Вычисление разрывов строк, но не упаковка. А?
  • Может быть, они означают, что сам прием NSString не будет мутирован, чтобы отражать перерывы? Но я этого не ожидаю?
  • Это предложение не согласуется с самим собой. У меня нет выбора, кроме как игнорировать его.

Однако, оказывается, есть смысл, который соответствует поведению, которое мы видим. Кажется, что они означают:

Эта процедура будет вычислять, где произойдет первый разрыв строки, и весь текст после этого игнорируется для вычисления ограничивающего прямоугольника.

Возвращаемая рамка будет иметь высоту одной строки и ширину до указанного максимума. (Ширина может быть меньше в зависимости от того, где вычисляется разрыв линии, или если текст достаточно короткий, чтобы он не нуждался в максимальной ширине.)

Чтобы, гм, ответить на реальный вопрос: для чего это полезно? Я не нашел ничего полезного: только вещи, где я думал, что это будет полезно, но не было. Однако некоторые вещи, которые, однако, имеют значение spring:

  • Центрирование однострочного фрагмента текста. Я думаю о кнопках и/или названиях здесь. (Хотя UILabel и UIButton могут это делать, иногда вы хотите сделать это сами.)
  • Вычисление границ для "извлечения" более длинного фрагмента текста. Здесь я думаю о том, где вы могли бы захотеть показать фрагмент гораздо большего фрагмента текста.

Ответ 3

Похоже, это было бы хорошо для однострочных меток. Например, если вы рисуете строку, которая может быть усечена или иметь разрыв строки, но вы на самом деле не будете рисовать более одной строки. Было бы полезно узнать точную высоту и ширину строки, чтобы вы могли расположить ее точно там, где вы хотите (и нарисовать другие элементы пользовательского интерфейса вокруг нее).

Ответ 4

Вот что я придумал после применения нескольких принципов из примера PyjamaSam:

AnnotationPin *myAnnotation = (AnnotationPin *)annotation;

self = [super initWithAnnotation:myAnnotation reuseIdentifier:reuseIdentifier];
self.backgroundColor = [UIColor greenColor];
self.frame = CGRectMake(0,0,30,30);
imageView = [[UIImageView alloc] initWithImage:myAnnotation.THEIMAGE];
imageView.frame = CGRectMake(3,3,20,20);
imageView.layer.masksToBounds = NO;
[self addSubview:imageView];
[imageView release];

CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
CGRect newFrame = self.frame;
newFrame.size.height = titleSize.height + 12;
newFrame.size.width = titleSize.width + 32;
self.frame = newFrame;
self.layer.borderColor = [UIColor colorWithRed:0 green:.3 blue:0 alpha:1.0f].CGColor;
self.layer.borderWidth = 3.0;

UILabel *infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(26,5,newFrame.size.width-32,newFrame.size.height-12)];
infoLabel.text = myAnnotation.title;
infoLabel.backgroundColor = [UIColor clearColor];
infoLabel.textColor = [UIColor blackColor];
infoLabel.textAlignment = UITextAlignmentCenter;
infoLabel.font = [UIFont systemFontOfSize:12];

[self addSubview:infoLabel];
[infoLabel release];

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

Ключ должен использовать CGSize titleSize = [myAnnotation.THETEXT sizeWithFont: [UIFont systemFontOfSize: 12]]; а затем переопределить размеры представления. Вы можете применить эту логику к любому виду, но она не обрабатывает разрывы строк, такие как Pajama's.

Хотя ответ Pajama работает для некоторых, это не сработало для меня. Это подробное объяснение, что вы должны попробовать сразу перед тем, как отправиться куда угодно, если хотите динамический пользовательский вывод MKAnnotation с изображением и изменяемым размером UILabel.