2012-03-16 14 views
6

Nella mia app per iPhone ho impostato un font personalizzato per tutti gli UILabels (per essere più precisi, ho sottoclassi UILabel, sovrascrivendo un metodo, impostando il carattere personalizzato in quel metodo e poi impostando tutte le etichette in IB quella classe personalizzata). Il problema ora è che tutti i testi sono resi troppo al di sotto della linea di base prevista, quindi le lettere come 'y' e 'g' sono tagliate sotto. Ho letto di problemi simili qui:UILabel con font personalizzato errato

UIButton custom font vertical alignment

Custom installed font not displayed correctly in UILabel

Allora ho provato trafficando con l'ascendente, come descritto in quelle soluzioni (è stato impostato a 990 inizialmente). Portarlo a circa 500 ha portato a buoni risultati, ma non molto tempo dopo ho notato che le linee nei testi multilinea si fondevano l'una nell'altra, il che ovviamente non è accettabile. Su UITextViews, il font sembra rendere bene con la linea di base iniziale però ..

Esiste un modo pratico per risolvere questo problema? Naturalmente potrei conservare diversi font con ascender diversi per i testi a linea singola o multipla, ma questa è una soluzione piuttosto caotica ..

PS: il font è fornito in formato otf, anche se ho provato a convertirlo in ttf , portando agli stessi risultati.

risposta

6

Ok, nel caso qualcuno sia interessato, ho trovato una soluzione che dovrebbe funzionare per me. Consiste semplicemente nell'override del metodo drawTextInRect di UILabel, nella modifica del rettangolo specificato e nel passarlo al metodo della superclasse.

- (void)drawTextInRect:(CGRect)rect { 
    CGFloat pointSize = self.font.pointSize; 

    CGRect newRect = CGRectMake(rect.origin.x, rect.origin.y - (0.25 * pointSize), rect.size.width, rect.size.height); 

    [super drawTextInRect:newRect]; 
} 

avrei potuto provare diversi valori diversi da 0,25 se ...

+0

ho usato questo. - (void) drawTextInRect: (CGRect) rect { CGFloat pointSize = self.font.pointSize; CGRect newRect = CGRectMake (rect.origin.x, rect.origin.y + (0,2 * pointSize), rect.size.width, rect.size.height); [super drawTextInRect: newRect]; } – kgibbon

Problemi correlati