Автоматическая регулировка высоты UILabel

Я использую следующие два метода (один из них – категория NSString а другой – категория UILabel ), чтобы автоматически регулировать высоту метки на основе текста внутри нее. Он отлично работает для большинства, но он имеет некоторые непредсказуемые результаты. Я не совсем уверен, где эта проблема может возникнуть, и я надеюсь, что некоторые из вас прекрасные люди могут предложить руку помощи. Во-первых, вот такие методы:

NSString Категория:

 - (CGFloat) fontSizeWithFont: (UIFont *) font constrainedToSize: (CGSize) size minimumFontSize: (CGFloat) minimumFontSize { CGFloat fontSize = [font pointSize]; CGFloat height = [self sizeWithFont: font constrainedToSize: CGSizeMake(size.width, FLT_MAX) lineBreakMode: NSLineBreakByWordWrapping].height; UIFont *newFont = font; // Reduce font size while too large, break if no height (empty string) while (height > size.height && height != 0 && fontSize > minimumFontSize) { fontSize--; newFont = [UIFont fontWithName: font.fontName size: fontSize]; height = [self sizeWithFont: newFont constrainedToSize: CGSizeMake(size.width, FLT_MAX) lineBreakMode: NSLineBreakByWordWrapping].height; }; // Loop through words in string and resize to fit for (NSString *word in [self componentsSeparatedByCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]) { CGFloat width = [word sizeWithFont: newFont].width; while (width > size.width && width != 0 && fontSize > minimumFontSize) { fontSize--; newFont = [UIFont fontWithName: font.fontName size: fontSize]; width = [word sizeWithFont: newFont].width; } } return fontSize; } 

UILabel Категория:

 - (void) sizeToFitMultipleLines { if (self.adjustsFontSizeToFitWidth) { CGFloat adjustedFontSize = [self.text fontSizeWithFont: self.font constrainedToSize: self.frame.size minimumFontSize: self.minimumScaleFactor]; self.font = [self.font fontWithSize: adjustedFontSize]; } [self sizeToFit]; } 

Возникающая проблема заключается в том, что высота метки имеет пустое пространство сверху и снизу, и чем длиннее строка внутри нее, тем больше пустое пространство. У одной метки линии может быть, возможно, 10 пикселей выше и ниже ее внутри фрейма метки, но строка из шести строк может иметь почти 100 пикселей. Я не могу отслеживать, где это дополнительное пространство исходит из вышеприведенных методов.

Во-вторых, ширина метки иногда корректируется там, где требуется только изменение высоты. Я предполагаю, что [self sizeToFit] является причиной этой конкретной проблемы, но я не совсем уверен, так как высота остается неуправленной, если я удалю ее. EDIT: я исправил эту проблему с шириной, вручную переставив метку после ее размера, чтобы она соответствовала (ее координата X теперь составляет ширину экрана минус ширина метки, разделенная на 2).

Есть предположения? Если вам нужна дополнительная информация или код, пожалуйста, спросите. Я всегда устанавливаю шрифт, прежде чем я вызову метод [sizeToFitMultipleLines] на соответствующих ярлыках, так что это не проблема.

One Solution collect form web for “Автоматическая регулировка высоты UILabel”

Я пробовал это, и он работал на меня. Надеюсь, это поможет вам немного.

 -(void) getDynamicHeightWithString:(NSString*)labelText forWidth:(CGFloat)lblWidth forPoint:(CGPoint)point { //Create Label UILabel *label = [[UILabel alloc] init]; label.text = labelText; label.numberOfLines = 0; label.lineBreakMode = NSLineBreakByWordWrapping; //Set frame according to string CGSize size = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(lblWidth, MAXFLOAT) lineBreakMode:UILineBreakModeWordWrap]; [label setFrame:CGRectMake(point.x , point.y , size.width , size.height)]; //Add Label in current view [self.view addSubview:label]; } 

ИСПОЛЬЗОВАНИЕ

 NSString *labelText = @"We are what our thoughts have made us; so take care about what you think. Words are secondary. Thoughts live; they travel far.The issue that's occurring is that the height of the label has empty space at its top and bottom, and that the longer the string inside it is, the larger that empty space is. A single line label might have perhaps 10 pixels above and below it inside the label's frame, but a six-line string may have almost 100 pixels. I'm not able to track down where this extra space is coming from in the methods above."; [self getDynamicHeightWithString:labelText forWidth:200 forPoint:CGPointMake(15, 15)]; 
  • iOS добавляет нижнюю границу в UILabel с тенью
  • Как заставить UILabel реагировать на нажатие?
  • Многострочный UILabel?
  • Swift CGAffineTransformScale до масштаба, а не по шкале
  • Установка фона UILabel (проблема прозрачности с .png-файлами)
  • Выровняйте три UILabels рядом друг с другом, и каждая метка может быть многострочной
  • Многострочные метки внутри scrollView отображаются только в одной строке и расширяются до полной ширины
  • Настройка текста меток в другом классе
  • изменение цвета текста UILabel
  • Анимация изменения текста в UILabel
  • Перетаскиваемая метка - ios
  • Interesting Posts

    дюймы между точками iPhone

    Приложение iOS «Приложение не может быть проверено» только на одном устройстве

    Тестирование блока Xcode с помощью Cocoapods

    uiscrollview не прокручивается из-за автоотключения

    Извлечь структуру из NSData в Swift

    iOS получить значок приложения из имени приложения

    получить AM / PM от установленного пользователем времени на iOS

    iOS Facebook SDK «Активный токен доступа должен использоваться для запроса информации о текущем пользователе».

    Доступ к основному классу приложений из целевой цели – iOS

    Чтение из результатов keychain в errSecItemNotFound 25300

    Определить свойство только для чтения в Swift

    Как реализовать MKAnnotationViews, которые вращаются с помощью карты

    Уничтожить массив JSON в массив объектов Swift

    Приложение переходит в режим ожидания на setIdleTimerDisabled: НЕТ

    как создать массив строк или float в Objective-C

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.