Что такое хорошо для?
В моем вопросе « Как мне получить -[NSString sizeWithFont:forWidth:lineBreakMode:]
работать? », Я узнал, что -[NSString sizeWithFont:constrainedToSize:lineBreakMode:]
был на самом деле тем, что мне нужно.
Документация для состояний -[NSString sizeWithFont:forWidth:lineBreakMode:]
объясняет, что она фактически не -[NSString sizeWithFont:forWidth:lineBreakMode:]
текст в дополнительные строки. Так как я буду использовать его? (Примеры помогут.)
- Как изменить заголовок кнопки «Назад» на панели навигации
- Использование iPhone - dequeueReusableCellWithIdentifier
- Скрытые особенности Xcode
- Чтение образцов с помощью AVAssetReader
- Как обнаружить паузу во вводе для UISearchBar / UITextField?
- Как отключить горизонтальную прокрутку UIScrollView?
- iOS 5: Интересно о UIAppearance
- NSMutableArray addObject не работает
- Сортировка NSArray строк или объектов даты
- Очереди отправки: как узнать, запущены ли они и как их остановить
- SEL выполняет выбор и аргументы
- Плохой URL-адрес при запросе с помощью NSURL
- Программно включить Bluetooth в iphone sdk?
Он отлично подходит для многострочных строк.
В основном это функция, которая позволяет вам увидеть, насколько велика будет строка при визуализации с помощью режима шрифта и прерывания строки.
Я использую его в нескольких местах в моем приложении, когда у меня есть текст переменной длины, который я хочу отобразить в определенной области.
По умолчанию 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;
Вы указываете, насколько велика область, в которую вы должны поместить текст, а затем этот метод сообщает вам, сколько места он займет (упаковывая по мере необходимости). Также, если строка будет переполнять границы прямоугольника, который вы предоставляете, вы можете сказать, а затем решили, как отображать текст.
Ссылка на него фактически не обертывает текст, потому что этот метод на самом деле ничего не делает для текста. Он просто фактически выдает его и возвращает, насколько большой участок, который ему нужно будет действительно выложить.
его ответственность за ярлык (или то, что когда-либо было в контейнере для текста), выполнить упаковку / что-то еще, что нужно сделать.
Надеюсь, это поможет.
Крис.
Некоторое время я думал, что эта рутина просто сломана. Похоже, что это идеальная рутина для определения того , насколько высока часть текста, когда она обертывается с определенной шириной . Однако это не то, что он делает. Действительно, возвращаемая высота всегда является одной строкой. (Что нецелесообразно, кстати: UIFont
-leading
возвращает то же значение.)
Процитировать документацию на момент написания:
Хотя он вычисляет разрывы строк, этот метод фактически не переносит текст на дополнительные строки; […]
Это предложение смутило меня в течение долгого времени. Мои мысли шли по строкам:
- Вычисление разрывов строк, но не упаковка. А?
- Может быть, они означают, что принимающая
NSString
сама не будет мутирована, чтобы отражать перерывы? Но я этого не ожидаю? - Это предложение не согласуется с самим собой. У меня нет выбора, кроме как игнорировать его.
Однако, оказывается, есть смысл, который соответствует поведению, которое мы видим. Кажется, что они означают:
Эта процедура будет вычислять, где произойдет первый разрыв строки, и весь текст после этого игнорируется для вычисления ограничивающего прямоугольника.
Поэтому возвратная рамка будет иметь высоту одной строки и ширину до указанного максимума. (Ширина может быть меньше в зависимости от того, где вычисляется разрыв линии, или если текст достаточно короткий, чтобы он не нуждался в максимальной ширине.)
Чтобы, гм, ответить на реальный вопрос: для чего это полезно? Я не нашел ничего полезного: только вещи, где я думал, что это будет полезно, но не было. Однако некоторые вещи, которые возникают на ум, таковы:
- Центрирование однострочного fragmentа текста. Я думаю о кнопках и / или названиях здесь. (Хотя
UILabel
иUIButton
могут это делать, иногда вы хотите сделать это сами.) - Вычисление границ для «извлечения» более длинного fragmentа текста. Здесь я думаю о том, где вы можете показать fragment гораздо большего fragmentа текста.
Похоже, это было бы хорошо для однострочных меток. Например, если вы рисуете строку, которая может быть усечена или иметь разрыв строки, но вы на самом деле не будете рисовать более одной строки. По-прежнему полезно знать точную высоту и ширину строки, поэтому вы можете расположить ее точно там, где вы хотите (и нарисовать вокруг нее другие элементы пользовательского интерфейса).
Вот что я придумал после применения нескольких принципов из примера 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];
В этом примере я добавляю пользовательский вывод в class MKAnnotation, который изменяет размер UILabel в соответствии с размером текста. Он также добавляет изображение в левой части представления, поэтому вы видите, что некоторые из кодов управляют правильным интервалом для обработки изображения и заполнения.
Ключ должен использовать CGSize titleSize = [myAnnotation.THETEXT sizeWithFont: [UIFont systemFontOfSize: 12]]; а затем переопределить размеры представления. Вы можете применить эту логику к любому виду, но она не обрабатывает разрывы строк, такие как Pajama’s.
Хотя ответ Паджамы работает для некоторых, это не сработало для меня. Это подробное объяснение, что вы должны попробовать сразу перед тем, как отправиться в другое место, если хотите динамический пользовательский вывод MKAnnotation с изображением и изменяемым размером UILabel.