2012-12-01 16 views
18

Desidero prendere un UILabel standard e aumentare la dimensione del carattere in modo che riempia lo spazio verticale. Prendendo ispirazione dalla risposta accettata per questo question, ho definito una sottoclasse su UILabel con questa implementazione drawRect:Ridimensionamento della dimensione del carattere per adattarsi verticalmente in UILabel

- (void)drawRect:(CGRect)rect 
{ 
    // Size required to render string 
    CGSize size = [self.text sizeWithFont:self.font]; 

    // For current font point size, calculate points per pixel 
    float pointsPerPixel = size.height/self.font.pointSize; 

    // Scale up point size for the height of the label 
    float desiredPointSize = rect.size.height * pointsPerPixel; 

    // Create and assign new UIFont with desired point Size 
    UIFont *newFont = [UIFont fontWithName:self.font.fontName size:desiredPointSize]; 
    self.font = newFont; 

    // Call super 
    [super drawRect:rect]; 
} 

Ma questo non funziona in quanto le dimensioni del font oltre la parte inferiore dell'etichetta. Se vuoi replicare questo, ho iniziato con un'etichetta 289x122 (w x h), Helvetica come font e un pointSize iniziale di 60 che si adatta comodamente all'etichetta. Ecco ad esempio in uscita da quella standard UILabel e il mio sottoclasse utilizzando la stringa "{Hg":

uilabel

uilabel subclass

Ho guardato discendenti dei caratteri e ascendenti, tentarono di scala tenendone conto in combinazioni diverse, ma ancora non hanno avuto fortuna. Qualche idea, è qualcosa che ha a che fare con diversi tipi di carattere che hanno lunghezze variabili di discender e ascender?

risposta

12

il calcolo per pointsPerPixel è il modo sbagliato up, dovrebbe essere ...

float pointsPerPixel = self.font.pointSize/size.height; 

Inoltre, forse questo codice dovrebbe essere in layoutSubviews come l'unica volta che il tipo di carattere dovrebbe essere cambiato è quando la dimensione del frame i cambiamenti.

+1

beh ... questo è stato un errore imbarazzante semplice. Grazie per averlo individuato. – user524261

+0

Ho provato a implementarlo in 'layoutSubviews', ma non penso che funzioni. Penso che la ragione è che l'assegnazione di un nuovo font alla sottoclasse 'UILabel' innesca un'altra chiamata di' layoutSubviews', che è problematica. Nella mia implementazione, una delle code della mia app è stata bloccata. – user444731

0

Mi chiedo se si tratta di un errore di arrotondamento che si avvicina alla successiva dimensione del carattere più grande. Potresti semplicemente ridimensionare leggermente la rec.size.height? Qualcosa di simile:

float desiredPointSize = rect.size.height *.90 * pointsPerPixel; 

Aggiornamento: il calcolo pointPerPixel è indietro. In realtà stai dividendo i pixel per punti font, anziché per pixel. Scambia quelli e funziona ogni volta. Solo per completezza, ecco il codice di esempio che ho provato:

//text to render  
NSString *soString = [NSString stringWithFormat:@"{Hg"]; 
UIFont *soFont = [UIFont fontWithName:@"Helvetica" size:12]; 

//box to render in 
CGRect rect = soLabel.frame; 

//calculate number of pixels used vertically for a given point size. 
//We assume that pixel-to-point ratio remains constant. 
CGSize size = [soString sizeWithFont:soFont]; 
float pointsPerPixel; 
pointsPerPixel = soFont.pointSize/size.height; //this calc works 
//pointsPerPixel = size.height/soFont.pointSize; //this calc does not work 

//now calc which fontsize fits in the label 
float desiredPointSize = rect.size.height * pointsPerPixel; 
UIFont *newFont = [UIFont fontWithName:@"Helvetica" size:desiredPointSize]; 

//and update the display 
[soLabel setFont:newFont]; 
soLabel.text = soString; 

Quella scala e montare all'interno della scatola etichetta per ogni taglia ho provato, che vanno da 40pt ai font 60pt. Quando ho invertito il calcolo, ho visto gli stessi risultati con il carattere troppo alto per la casella.

+0

Non c'è arrotondamento agli integer perché utilizziamo valori float pointSize. Anche così, fontSize è fuori più di un intero pointSize. Concordato sul fatto che è possibile ridimensionare di un fattore, ma si tratta più di un fudge di un calcolo esatto e varia in base al carattere. – user524261

Problemi correlati