2013-08-15 20 views
27

Come il UILabel può essere allineato dal basso. Diciamo che la mia etichetta può contenere tre righe di testo. Se il testo di input è una sola riga, questa riga dovrebbe trovarsi in fondo all'etichetta.Per favore, fai riferimento all'immagine qui sotto per una migliore comprensione. L'area arancione è il frame completo dell'etichetta. Attualmente ha una linea e il centro è allineato. Quindi quello che voglio è che dovrebbe sempre essere allineato in basso indipendentemente da quante linee.Come allineare il testo UILabel dal basso?

enter image description here

prega di suggerire le vostre idee.

Grazie.

risposta

20

Qui ci sono due modi di fare che ...

1. primo set numberOfLines-0 e quindi utilizzare sizeToFit proprietà di UILabel modo display UILabel con il suo contentSize.

yourLabel.numberOfLines = 0; 

[yourLabel sizeToFit]; 

Tutte le informazioni da questo link: Vertically align text within a UILabel

2. Un'altra opzione è quella di prendere UITextField invece di UILabel e impostare userInteractionEnabled-NO come qui di seguito ...

[yourTextField setUserInteractionEnabled:NO]; 

e quindi imposta la proprietà contentVerticalAlignment in basso come in basso ....

[yourTextField setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom]; 

UPDATE

Inoltre, con UITextField, non possiamo raggiungere più righe. Quindi invece possiamo usare UITextView e impostare il suo userInteractionEnabled su NO. Quindi, utilizza il codice seguente per renderlo allineato in basso.

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

Ho già provato la prima soluzione. Ma non funziona correttamente. È sempre allineato in alto ea sinistra. Ma dovrebbe essere allineato in fondo e al centro sempre. Ma la seconda soluzione sembra funzionare. che dire della linea multipla in seconda soluzione? sarà possibile? – NSUserDefault

+0

supponiamo che questo frame con 3 righe sia 'CGRectMake (10,100,100,300);' quindi se si ottiene solo una riga, allora imposta frame come quello 'CGRectMake (10,260,100,300);', qui basta impostare un codice personalizzato con la logica ** altrimenti ** seconda opzione è meglio :) –

+0

Ya secondo è il migliore. Proverò a farti sapere. – NSUserDefault

0

È possibile creare una sottoclasse UILabel e l'override del metodo:

- (void)drawTextInRect:(CGRect)rect 

chiamata super-drawTextInRect con il rettangolo in cui si desidera utilizzare.

+0

È inoltre possibile utilizzare - (CGRect) textRectForBounds: (CGRect) limiti limitedToNumberOfLines: (NSInteger) numberOfLines; che potrebbe essere più esplicito. – Dustin

15

sottoclasse UILabel

@interface Label : UILabel 

@end 

Poi ignorare drawTextInRect in questo modo

@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

Questo in realtà funziona perfettamente per me, con quasi nessuno sforzo, e non sembra hacky come alcune delle altre soluzioni qui. –

0

ho avuto lo stesso problema.Ecco come ho fatto per allineare il testo al fondo della mia 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 si semplice chiamare il metodo come questo per allineare al fondo:

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

Un'altra opzione: utilizzare un'etichetta per il tuo colore di sfondo, io chiamo questo originalLabel e un altro per il testo, chiamato textLabel nel mio esempio. Quindi calcolare l'altezza e coordinate Y per 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 impostare solamente un vincolo inferiore alla vista eccellente in IB che funziona per me senza usare codice ed anche il numero di linee per un vincolo massimo.