2011-02-05 12 views
5

Sto provando a rielaborare il testo in un UILabel per lasciare un margine attorno al testo che mostra il colore di sfondo. Seguendo il suggerimento here ho sovrascritto textRectForBounds:limitedToNumberOfLines: in questo modo:UILabel textRectForBounds non ha effetto quando si tenta di creare un margine

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines 
{ 
    CGRect intermediate = CGRectMake(bounds.origin.x+MARGIN,bounds.origin.y+MARGIN,bounds.size.width-2*MARGIN,bounds.size.height-2*MARGIN); 
    return [super textRectForBounds:intermediate limitedToNumberOfLines:numberOfLines]; 
} 

Ma non importa quello che faccio, il testo finisce stretto contro il bordo sinistro del rettangolo. Sembra che il disegno ignori la parte di origine del CGRect restituito (anche se sembra che rispetti la parte della larghezza, come se riducessi alla larghezza dell'intermedio ad esempio bounds.size.width-200 il rect che textRectForBounds restituisce sia opportunamente stretto e il testo sia disegnato in una colonna lunga e magra).

Quindi: cos'altro devo fare per il UILabel per fare in modo che il disegno rispetti l'origine textForRectBounds -returned-rect.x e origin.y? Preferisco non ignorare lo UILabeldrawTextInRect se posso aiutarlo.

Aggiornamento: Questo è stato molto tempo fa e non ricordo esattamente perché l'altra domanda non ha funzionato per me. Credo che fosse perché stavo cercando di avere uno UILabel con più linee, e la soluzione here non ha funzionato in quel caso.

+0

Hai provato a restituire 'intermediate' direttamente? –

+0

sì, ma non fa differenza. – damian

risposta

8

penso che si dovrebbe ignorare sia textRectForBounds:limitedToNumberOfLines: e drawTextInRect: come questo:

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines 
{ 
    return CGRectInset(bounds, MARGIN, MARGIN); 
} 

- (void)drawTextInRect:(CGRect)rect 
{ 
    [super drawTextInRect: CGRectInset(self.bounds, MARGIN, MARGIN)]; 
} 
+0

Grazie, ha funzionato (più o meno): ho dovuto fare qualche aggiustamento alla larghezza del rect per far funzionare le cose correttamente con più linee, ma alla fine l'ho fatto funzionare. – damian

+0

Se si esegue questa operazione (per abbinare UITextView) è possibile anche sovrascrivere sizeThatFits come questo: - (CGSize) sizeThatFits: (CGSize) size { CGSize fSize = [super sizeThatFits: size]; fSize.width + = 2 * MARGIN; fSIze.height + = 2 * MARGIN; return fSize; } –

+1

Non funziona per me, non viene ancora chiamato. –

0

Controllare la documentazione, potrebbe essere di qualche aiuto. le chiamate a super potrebbero non restituire i valori che assumi.

Non chiamare questo metodo direttamente. Questo metodo deve essere solo sovrascritto da sottoclassi che desiderano modificare il rettangolo delimitatore del ricevitore prima di eseguire qualsiasi altro calcolo . Utilizzare il valore nel parametro numberOfLines per limitare l'altezza del rettangolo restituito a il numero specificato di righe di testo. Per chiamare questo metodo, è necessario che sia una chiamata preventiva al metodo sizeToFit o sizeThatFits:. Nota che etichette oggetti UITableViewCell sono dimensionate in base alle dimensioni delle celle, e non una dimensione richiesta L'implementazione predefinita di questo metodo restituisce originali limiti rettangolo.

Buona fortuna!

+0

In realtà, la documentazione non è corretta con 'limitedToNumberOfLines: 0'. Il passato in 'bounds 'ha un' height' che assomiglia a 'INT_MAX_VALUE' o qualcosa, e l'implementazione di default sembra ridurlo a un livello abbastanza alto da adattarsi al testo. – damian

Problemi correlati