Как настроить текстовую метку в iOS UIAlertView

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

Я мог бы успешно изменить его размер, отформатировать шрифты и т. Д. Для небольших строк. Я могу вписаться в некоторые из моих строк (<1000 символов), но большие строки (>1000 символов) делают это уродливым:

  • Ярлык просто отказывается расти, чтобы соответствовать дополнительному контенту
  • Размер текста не уменьшается, несмотря на то, что я его уменьшаю (он уменьшается для строк меньшего размера, где он не нужен. И он остается больше там, где нужно меньше)
  • Ярлык показывает с белым фоном (тот, который видели в IB во время разработки) для более крупных строк, с задней частью строк, скрытой из-за более крупного текста.

Все выглядит совершенно запутанным.

Вот как я проник в код внешнего вида UIAlertView:

-(void)willPresentAlertView:(UIAlertView *)alertView
{
    UILabel *body = [alertView valueForKey:@"_bodyTextLabel"]; 

    body.lineBreakMode = UILineBreakModeWordWrap;
    // body.adjustsFontSizeToFitWidth = YES;

    CGRect  alFrame = body.frame;

    CGFloat pointSize;

    UIFont * font = [UIFont fontWithName:@"Verdana" size:10];

    CGSize labelSize = [body.text sizeWithFont:font minFontSize:8   actualFontSize:&pointSize forWidth:alFrame.size.width  lineBreakMode:UILineBreakModeWordWrap];

    NSLog (@"%f", labelSize.height);
    UIFont *actualFont = [UIFont fontWithName:@"Verdana" size:10];
    CGSize sizeWithCorrectHeight = [body.text sizeWithFont:actualFont];

    alFrame.size.height = sizeWithCorrectHeight.height*10;
    NSLog (@"%f - %f", alFrame.size.height, alFrame.size.width);
    body.numberOfLines = 8;
    body.frame = alFrame;
    body.font = actualFont;    
}

Обратите внимание, что закомментированные строки - это то, что я пробовал с тысячами поворотов. И незакомментированные тоже дают такой же эффект. Меньший текст настраивается так же, как я здесь кодировал. Мне просто нужно решение, которое может заставить мою метку отображать весь текст, независимо от длины строки - я знаю, что на нем еще достаточно места, но он просто не изменяет размер для больших строк.

2 ответа

Решение

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

  1. использование sizeWithFont выяснить, сколько места вам нужно (из текста сообщения).
  2. Установите в сообщении соответствующее количество @"\n",
  3. Вставить новый прозрачный UILabel как подпредставление просмотра предупреждений с вашим текстом.

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

[alertView addSubview:label];

Во-первых, вы не должны использовать sizeWithFont... методы для расчета размера вашего UILabel s.

UILabel реализует стандарт UIKit sizeToFit а также sizeThatFits: методы, которые вы должны использовать вместо.

Если вы хотите, чтобы метка была перенесена на несколько строк, сначала установите numberOfLines до 0. Затем используйте этот код для расчета необходимого размера:

CGSize requiredSize = [label sizeThatFits:CGSizeMake(availableWidth, CGFLOAT_MAX)];
labelFrame.size = requiredSize;
// ...

Кроме того, вы можете сначала установить ширину метки, а затем вызвать [label sizeToFit], Размер будет соответствовать его текущей ширине.

Другие вопросы по тегам