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);