Как настроить текстовую метку в 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 ответа
Вот взлом, который я успешно использовал во многих приложениях доставки.
- использование
sizeWithFont
выяснить, сколько места вам нужно (из текста сообщения). - Установите в сообщении соответствующее количество
@"\n"
, - Вставить новый прозрачный
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]
, Размер будет соответствовать его текущей ширине.