2013-08-15 18 views
27

W jaki sposób UILabel może być wyrównany od dołu. Powiedzmy, że moja etykieta może zawierać trzy linie tekstu. Jeśli tekst wejściowy jest pojedynczą linią, ta linia powinna znaleźć się na dole etykiety. Zapoznaj się z poniższym obrazem, aby lepiej zrozumieć. Pomarańczowy obszar to pełna klatka etykiety. Obecnie ma jedną linię i jest wyrównana do środka. Tak, czego chcę, to zawsze powinien być wyrównany do dołu, niezależnie od tego, ile linii.Jak wyrównać tekst UILabel od dołu?

enter image description here

Proszę zaproponować swoje pomysły.

Dziękuję.

Odpowiedz

20

Oto dwa sposoby, które ...

1. Pierwszy set numberOfLines na 0, a następnie użyć sizeToFit własność UILabel tak wyświetlaczu UILabel z contentSize.

yourLabel.numberOfLines = 0; 

[yourLabel sizeToFit]; 

Zobacz więcej informacji z tego linku: Vertically align text within a UILabel

2. Inną opcją jest wziąć UITextField zamiast UILabel i ustawić userInteractionEnabled do NO jak poniżej ...

[yourTextField setUserInteractionEnabled:NO]; 

i następnie ustaw właściwość contentVerticalAlignment na dole, tak jak poniżej ....

[yourTextField setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom]; 

UPDATE

Również z UITextField, nie możemy osiągnąć wiele linii. Zamiast tego możemy użyć UITextView i ustawić jego userInteractionEnabled na NO. Następnie użyj poniższego kodu, aby dopasować go do dołu.

CGFloat topCorrect = ([label bounds].size.height - [label contentSize].height); 
topCorrect = (topCorrect <0.0 ? 0.0 : topCorrect); 
label.contentOffset = (CGPoint){.x = 0, .y = -topCorrect}; 
+0

Próbowałem już pierwszego rozwiązania. Ale nie działa prawidłowo.Jest zawsze wyrównany w górnej i lewej. Ale zawsze powinien być wyrównany na dole i środek. Ale drugie rozwiązanie wydaje się działać. a co z wieloma liniami w drugim rozwiązaniu? czy będzie to możliwe? – NSUserDefault

+0

załóżmy, że ta ramka z 3 liniami to 'CGRectMake (10,100,100,300);' jeśli otrzymasz tylko jedną linię, ustaw taką ramkę jak 'CGRectMake (10,260,100,300) ;, tutaj ustaw kod niestandardowy z logiką ** inaczej ** druga opcja jest najlepszy :) –

+0

Ya sekunda jest najlepsza. Postaram się dać znać. – NSUserDefault

0

Można podklasy UILabel i przesłanianie metody:

- (void)drawTextInRect:(CGRect)rect 

wezwanie Super drawTextInRect z rect której chcesz użyć.

+0

Można również użyć - (CGRect) textRectForBounds: (CGRect) bounds limitedToNumberOfLines: (NSInteger) numberOfLines; , co może być bardziej jednoznaczne. – Dustin

15

Podklasa UILabel

@interface Label : UILabel 

@end 

następnie zastąpić drawTextInRect jak tak

@implementation Label 

- (void)drawTextInRect:(CGRect)rect 
{ 
    if(alignment == top) { 

     rect.size.height = [self sizeThatFits:rect.size].height; 
    } 

    if(alignment == bottom) { 

     CGFloat height = [self sizeThatFits:rect.size].height; 

     rect.origin.y += rect.size.height - height; 
     rect.size.height = height; 
    } 

    [super drawTextInRect:rect]; 
} 

@end 
+0

To naprawdę działa idealnie dla mnie, prawie bez wysiłku, i nie jest tak hackowaty jak niektóre inne rozwiązania tutaj. –

0

miałem ten sam problem.Oto jak zrobiłem, aby wyrównać tekst do głębi UILabel:

- (void)alignLabel:(UILabel *)l withText:(NSString *)text verticalAlignOption:(int)vertAlign{ 
CGSize stringSize = [text sizeWithFont:l.font constrainedToSize:l.frame.size lineBreakMode:l.lineBreakMode]; 

switch (vertAlign) { 
    case 0: // align = top 
     l.frame = CGRectMake(l.frame.origin.x, 
            l.frame.origin.y, 
            l.frame.size.width, 
            stringSize.height 
            ); 
     break; 
    case 1: // align = bottom 
     l.frame = CGRectMake(l.frame.origin.x, 
            (l.frame.origin.y + l.frame.size.height) - stringSize.height, 
            l.frame.size.width, 
            stringSize.height 
            ); 
     break; 
    case 2: // align = middle 
     // default 
     break; 
} 

l.text = text; 
} 

Ahd Ci prosty nazywamy metodę tak, aby wyrównać do dołu:

[self alignLabel:self.mediaTitle withText:@"My text to align" verticalAlignOption:1]; 
0

Inna możliwość: wykorzystać jedną etykietę dla koloru tła, nazywam ten jeden originalLabel, a drugi dla tekstu, o nazwie textLabel w moim przykładzie. Następnie obliczyć wysokość i Współrzędna Y textLabel:

[textLabel sizeToFit]; 
int height = textLabel.frame.size.height; 
int yCoord = originalLabel.frame.origin.y + 
      originalLabel.frame.size.height - height; 
textLabel.frame = CGRectMake(originalLabel.frame.origin.x, yCoord, 
      textLabel.frame.size.width, height); 
2

I tylko ustawić dolne ograniczenie do super widok w IB, który pracuje dla mnie bez użycia kodu, a także liczbę wierszy dla maksymalnego ograniczenia.