2013-02-22 18 views
16

Witam Mam MBProgressHUD na moim ekranie iPada. Działa idealnie dobrze. Ale chcę zmienić etykietę, aby pokazać w trzech lines.Like toMBProgressHUD, aby wyświetlić tekst etykiety w więcej niż jednej linii

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

więc chcę etykietę w 3 liniach

ładowania danych.

Czekaj

1-2 minuty

LUB mogę przypisać zdjęcie do HUD?

Wszystko to powinno znajdować się w etykiecie tekstu. Ale kończę z tylko jedną linią. Jak mogę to zrobić? Jeśli potrzebujesz więcej informacji, pytaj. Dzięki.

+0

Spróbuj użyć '[NSString stringWithFormat: @" Ładowanie danych. \ N Proszę czekać. \ N 1-2 minuty "]'. Nie wiem, czy jest obsługiwane w MBProgressHUD. – iDev

+0

@ ACB.Spróbowałem. Wciąż w tej samej linii. – RookieAppler

+0

Następnie możesz zmodyfikować implementację MBProgressHUD. Sprawdź, czy są dostępne jakieś opcje. – iDev

Odpowiedz

34

Szczegóły MBProgressHUD Własność labelText jest multilinią, ale nie właściwością labelText.

Więc można spróbować coś takiego

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; 

Można ustawić czcionkę detailsLabelText za pomocą właściwości detailsLabelFont.

+1

To interesujące. Z ciekawości przyjrzałem się źródłu, próbując zrozumieć, dlaczego szczegółyLabelText były wielowierszowe, ale labelText nie był i nie widział żadnej różnicy. Czy wiesz, jaki parametr powoduje, że jeden multilinii, a drugi nie? – hkatz

+2

Parametrem jest numberOfLines. Ustaw tak jak poniżej: label.numberOfLines = 0; –

3

Powód, dla którego labelText różni się od szczegółówTekst, wyobrażam sobie, ponieważ ma on być bardzo podobny do UIAlertView z perspektywy tytuł/opis.

Różnice między tymi dwoma etykietami jest dość wyraźna ze względu na ich przeznaczenie, na przykład:

  • Tytuły mają większe czcionki, pogrubienie oft razy w porównaniu do szczegółów tekstu.
  • Tytuły mają być krótkie i jasne, zaczerpnięty z popularnego serwisu słowniku (opis mówi sama za siebie):

Tytuł: opisową nazwę; epitet.

Zalecam, aby nie mieć tytułu z wieloma wierszami, krótkiego opisu i tekstu opisu.

Powodem, dla którego wieloliniowe tytuły nie działają, jest fakt, że z powodu implementacji layoutSubviews rozmiar nie jest obliczany. jeśli inspekcję MBProgressHud.m, w 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; 
} 

Zanotować -[NSString sizeWithFont: constrainedToSize: lineBreakMode:] wzywają do tekstu opisu; ta metoda oblicza rozmiar wymagany do wyświetlenia tekstu - z użyciem jak największej liczby linii, podczas gdy -[NSString sizeWithFont:] oblicza rozmiar wymagany do wyświetlenia tekstu, ale tylko do wyświetlenia jednej linii.

Odradzam posługiwanie się tytułem wielowierszowym, a zamiast tego zapewniam krótszy tytuł z dołączonym tekstem opisu.

Jeśli po prostu musisz mieć tytuł wielowierszowy (wszystkie zmiany w obrębie 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]; 
    ... 

Wymienić:

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

Z:

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

nadzieję, że to nie jest zbyt późno, aby pomóc.

1

Miałem takie pytanie również!

Można ustawić hud.label.numberOfLines = 0;

I to działa!

0

self.hud.minSize = CGSizeMake (300, 100);

Powiązane problemy