2010-04-23 19 views
10

Devo anche fare tutto questo pazzo materiale di conversione del sistema di coordinate qui, o è un UILabel diverso da un disegno UIImageView in -drawRect:?Come disegnare un UILabel in -drawRect :?

C'è un metodo chiamato - (void)drawTextInRect:(CGRect)rect per quello.

ma la documentazione dice: ". Non si dovrebbe chiamare questo metodo direttamente Questo metodo deve essere ignorato solo da sottoclassi che vogliono modificare il comportamento di disegno predefinito per il testo dell'etichetta"

Quindi? Come disegnarlo quindi in -drawRect :?

risposta

15

Se si esegue il disegno personalizzato nella propria vista non è necessario disegnare UILabel o un altro elemento dell'interfaccia utente, ma piuttosto disegnare il testo stesso. NSString ha diversi metodi per il disegno in contesto attuale (un'occhiata a documenti di estensione UIKit di NSString per ottenere altri metodi):

- (CGSize)drawInRect:(CGRect)rect withFont:(UIFont *)font 
- (CGSize)drawAtPoint:(CGPoint)point withFont:(UIFont *)font 
+1

Hey io vengo da iOS 7 e entrambi questi metodi sono stati deprecati insieme a quasi tutti i metodi di disegno 'NSString'. Sai come 'drawAtPoint: withAttributes:' funziona? –

17

UILabel è diversa in quanto non è necessario disegnare manualmente il testo per modificare il modo in cui viene presentato. Sottoclasse UILabel e overriding -drawTextInRect: è il modo più rapido per modificare il modo in cui viene eseguito il rendering di UILabel. Ad esempio,

- (void)drawTextInRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetShadowWithColor(context, shadowOffset, shadowRadius, [shadowColor CGColor]); 
    [super drawTextInRect:rect]; 
} 

aggiungerà un'ombra con un offset specifica, il raggio, e il colore (come istanza UIColor) a qualsiasi testo che si disegna in quel UILabel. Per un esempio di questo in azione, vedere a project I put together for a recent class.

Tuttavia, se quello che stai cercando di fare è solo disegnare il testo all'interno di un'altra vista, la risposta di Vladimir è la strada da percorrere.

+0

sfortunatamente, facendolo, la via di Vladimir non funzionerà molto bene. UILabel ha una logica intelligente per calcolare la dimensione del testo ridotta quando non si adatta all'etichetta. Vedi le mie altre domande, non ero in grado di riprodurre quella logica a causa di bug nei metodi forniti. Ma grazie comunque. – dontWatchMyProfile

+0

btw, il tuo link sembra rotto – dontWatchMyProfile

+0

@mystify - Mi dispiace, piccolo server web hiccup. Provalo ora. –

0

In realtà si può fare.

Prova questo:

UILabel *lblRef = [[UILabel alloc] initWithFrame:CGRectMake(x, y, width, height)]; 
lblRef.text = [refs objectAtIndex:barCount]; 
lblRef.adjustsFontSizeToFitWidth = TRUE; 
lblRef.adjustsLetterSpacingToFitWidth = TRUE; 
lblRef.textColor = self.color; 
[lblRef setTextAlignment:NSTextAlignmentCenter]; 
lblRef.backgroundColor = [UIColor clearColor]; 
[self addSubview:lblRef];