MBProgressHUD для отображения текста метки в нескольких строках
Привет, у меня есть MBProgressHUD на моем экране iPad. Работает отлично. Но я хочу изменить ярлык, чтобы показать его в трех строках. Подобно этому
self.hud = [[MBProgressHUD alloc] initWithView:self.navigationController.view];
self.hud.frame = CGRectMake(0, 0, 120, 143);
[self.navigationController.view addSubview:self.hud];
self.hud.delegate = self;
self.hud.mode = MBProgressHUDModeAnnularDeterminate;
NSString *strloadingText = [NSString stringWithFormat:@"Loading Data.\r Please Wait.\r 1-2 Minutes"];
NSLog(@"the loading text will be %@",strloadingText);
self.hud.labelText = strloadingText;
[self.hud show:YES];
Итак, я хочу, чтобы метка была в трех строках
Загрузка данных.
Подождите
1-2 минуты
ИЛИ
могу ли я присвоить изображение HUD?
Все это должно быть в тексте меток. Но я заканчиваю только одной строкой. Как я могу это сделать?
Если вам нужна дополнительная информация, пожалуйста, спросите. Спасибо.
Ответы
Ответ 1
Значение свойства MBProgressHUDLabelText является многострочным, но не имеет свойство labelText.
Итак, вы можете попробовать что-то вроде этого
MBProgressHUD * hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.frame = CGRectMake(0, 0, 120, 143);
hud.mode = MBProgressHUDModeAnnularDeterminate;
NSString *strloadingText = [NSString stringWithFormat:@"Loading Data."];
NSString *strloadingText2 = [NSString stringWithFormat:@" Please Wait.\r 1-2 Minutes"];
NSLog(@"the loading text will be %@",strloadingText);
hud.labelText = strloadingText;
hud.detailsLabelText=strloadingText2;
Вы можете установить detailLabelText шрифт, используя свойство detailsLabelFont.
Ответ 2
Причина, по которой labelText отличается от detailsText, я предполагаю, потому что она должна быть очень похожей на UIAlertView с точки зрения названия/описания.
Различия между двумя метками весьма различны из-за их назначения, например:
- Заголовки имеют большие шрифты, часто повторяющиеся по сравнению с подробным текстом.
- Заголовки должны быть короткими и очевидными, взятыми из популярного словарного сайта (описание говорит само за себя):
Название: описательное имя; эпитет.
Я бы порекомендовал не иметь многострочный заголовок, держать его коротким и использовать текст описания.
Причина, по которой многострочные заголовки не работают, связана с реализацией layoutSubviews, размер не вычисляется. если вы проверите MBProgressHud.m, в layoutSubviews,
CGFloat remainingHeight = bounds.size.height - totalSize.height - kPadding - 4 * margin;
CGSize maxSize = CGSizeMake(maxWidth, remainingHeight);
CGSize detailsLabelSize = [detailsLabel.text sizeWithFont:detailsLabel.font
constrainedToSize:maxSize lineBreakMode:detailsLabel.lineBreakMode];
totalSize.width = MAX(totalSize.width, detailsLabelSize.width);
totalSize.height += detailsLabelSize.height;
if (detailsLabelSize.height > 0.f && (indicatorF.size.height > 0.f || labelSize.height > 0.f)) {
totalSize.height += kPadding;
}
Обратите внимание на вызов -[NSString sizeWithFont: constrainedToSize: lineBreakMode:]
для текста описания; этот метод вычисляет размер, необходимый для отображения текста, - используя столько строк, сколько необходимо, тогда как -[NSString sizeWithFont:]
вычисляет размер, необходимый для отображения текста, но только до отображения одной строки.
Я бы посоветовал не иметь многострочный заголовок и вместо этого предоставлять более короткий заголовок, сопровождаемый текстом описания.
Если вы просто должны иметь многострочный заголовок (все изменения в MBProgressHud.m):
- (void)setupLabels {
label = [[UILabel alloc] initWithFrame:self.bounds];
label.adjustsFontSizeToFitWidth = NO;
label.textAlignment = MBLabelAlignmentCenter;
label.opaque = NO;
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor whiteColor];
label.font = self.labelFont;
label.text = self.labelText;
>>> label.numberOfLines = 0;
[self addSubview:label];
...
Заменить:
CGSize labelSize = [label.text sizeWithFont:label.font];
labelSize.width = MIN(labelSize.width, maxWidth);
totalSize.width = MAX(totalSize.width, labelSize.width);
totalSize.height += labelSize.height;
if (labelSize.height > 0.f && indicatorF.size.height > 0.f) {
totalSize.height += kPadding;
}
CGFloat remainingHeight = bounds.size.height - totalSize.height - kPadding - 4 * margin;
CGSize maxSize = CGSizeMake(maxWidth, remainingHeight);
CGSize detailsLabelSize = [detailsLabel.text sizeWithFont:detailsLabel.font
constrainedToSize:maxSize lineBreakMode:detailsLabel.lineBreakMode];
С помощью:
CGFloat remainingHeight = bounds.size.height - totalSize.height - kPadding - 4 * margin;
CGSize maxSize = CGSizeMake(maxWidth, remainingHeight);
CGSize labelSize = [label.text sizeWithFont:label.font constrainedToSize:maxSize lineBreakMode:label.lineBreakMode];
totalSize.width = MAX(totalSize.width, labelSize.width);
totalSize.height += labelSize.height;
if (labelSize.height > 0.f && indicatorF.size.height > 0.f) {
totalSize.height += kPadding;
}
remainingHeight = bounds.size.height - totalSize.height - kPadding - 4 * margin;
CGSize detailsLabelSize = [detailsLabel.text sizeWithFont:detailsLabel.font
constrainedToSize:maxSize lineBreakMode:detailsLabel.lineBreakMode];
Надеюсь, что это не слишком поздно, чтобы помочь.
Ответ 3
У меня тоже был такой вопрос!
Вы можете установить hud.label.numberOfLines = 0;
И он работает!
Ответ 4
self.hud.minSize = CGSizeMake (300, 100);