Come ottenere UILabel (UITextView) dimensione del carattere regolata automaticamente?

È ansible ottenere la dimensione del carattere finale, dopo l’autoadjusting? (proprietà adjustsFontSizeToFitWidth impostato su YES e la dimensione del carattere del testo viene ridotta per adattarsi all’etichetta)

Sto sottoclassi drawTextInRect in UILabel per mettere il gradiente sul testo, ma la dimensione del gradiente deve essere la stessa, come la dimensione del carattere. Non riesco a ottenere la dimensione corretta del carattere corretto … È ansible?

//draw gradient CGContextSaveGState(myContext); CGGradientRef glossGradient; CGColorSpaceRef rgbColorspace; size_t num_locations = 2; CGFloat locations[2] = { 0.0, 1.0 }; CGFloat components[8] = { 1, 1, 1, 0.25, // BOTTOM color 1, 1, 1, 0.12 }; // UPPER color //scale and translate so that text would not be rotated 180 deg wrong CGContextTranslateCTM(myContext, 0, rect.size.height); CGContextScaleCTM(myContext, 1.0, -1.0); //create mask CGImageRef alphaMask = CGBitmapContextCreateImage(myContext); CGContextClipToMask(myContext, rect, alphaMask); rgbColorspace = CGColorSpaceCreateDeviceRGB(); glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations); //gradient should be sized to actual font size. THIS IS THE PROBLEM - EVEN IF FONT IS AUTO ADUJSTED, I AM GETTING THE SAME ORIGINAL FONT SIZE!!! CGFloat fontCapHeightHalf = (self.font.capHeight/2)+5; CGRect currentBounds = rect; CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMidY(currentBounds)-fontCapHeightHalf); CGPoint midCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMidY(currentBounds)+fontCapHeightHalf); CGContextDrawLinearGradient(myContext, glossGradient, topCenter, midCenter, 0); CGGradientRelease(glossGradient); CGColorSpaceRelease(rgbColorspace); CGContextRestoreGState(myContext); 

Non puoi ottenere la dimensione direttamente, ma puoi calcolarla abbastanza facilmente usando queste funzioni :

 CGFloat actualFontSize; [label.text sizeWithFont:label.font minFontSize:label.minimumFontSize actualFontSize:&actualFontSize forWidth:label.bounds.size.width lineBreakMode:label.lineBreakMode]; 
 CGSize size = [label.text sizeWithFont:label.font minFontSize:10 actualFontSize:&actualFontSize forWidth:200 lineBreakMode:UILineBreakModeTailTruncation]; 

La mia risposta non è molto utile per la domanda originale, ma finisco qui ogni volta che cerco come ottenere la dimensione del carattere dopo la regolazione automatica. Innanzitutto, sizeWithFont è stato deprecato in iOS 7.0, come tutti sappiamo, quindi dobbiamo trovare un’altra soluzione.

La mia soluzione si adatta al mio caso, in cui ho due etichette, una con più vincoli e più testo della seconda.

Ecco un esempio dettagliato:

  • due etichette con stessa larghezza e lunghezza del testo diversa:

inserisci la descrizione dell'immagine qui

Voglio, in fase di runtime, la dimensione del carattere del dispositivo uilabel principale da ridimensionare e il secondo di avere la stessa dimensione del carattere.

  • diminuire le dimensioni di entrambe le etichette, in modo che il testo del primo si adatti al fotogramma, in questo caso 12 per entrambi:

inserisci la descrizione dell'immagine qui

inserisci la descrizione dell'immagine qui

  • dopo aver impostato i vincoli di posizione (nel mio esempio, le etichette rimangono al centro della vista genitore), aggiorna i fotogrammi di entrambe le etichette in modo che si adattino esattamente al testo:

inserisci la descrizione dell'immagine qui

  • aggiungere i vincoli Aspect Ratio tra larghezza e altezza a entrambe le etichette e il vincolo di larghezza tra l’etichetta principale e la vista genitore:

inserisci la descrizione dell'immagine qui

inserisci la descrizione dell'immagine qui

  • aggiungi il vincolo di larghezza dalla seconda etichetta all’etichetta principale:

inserisci la descrizione dell'immagine qui

inserisci la descrizione dell'immagine qui

  • ora puoi impostare la dimensione del carattere delle etichette come desideri:

inserisci la descrizione dell'immagine qui

Ecco uno screenshot del simulatore:

inserisci la descrizione dell'immagine qui

La prima etichetta viene ridimensionata in base alle dimensioni dello schermo e la dimensione del carattere viene regolata di conseguenza. La dimensione del carattere della seconda etichetta è la stessa a causa del vincolo della larghezza e dei parametri del carattere specificati nell’ultima immagine.

Questo è solo un esempio che mira a mostrare il “trucco” dietro la mia soluzione: bind i frame delle etichette con una dimensione iniziale del font, in modo che sia lo stesso in fase di esecuzione. Immagino che questa tecnica possa essere riadattata a etichette con una dimensione variabile , semplicemente aggiungendo i vincoli tra le etichette dopo aver impostato il testo e aver ridimensionato la cornice per adattarla al testo.

Questa semplice soluzione funziona perfettamente con UILabel a una riga:

 //myLabel - initial label UILabel *fullSizeLabel = [UILabel new]; fullSizeLabel.font = myLabel.font; fullSizeLabel.text = myLabel.text; [fullSizeLabel sizeToFit]; CGFloat actualFontSize = myLabel.font.pointSize * (myLabel.bounds.size.width / fullSizeLabel.bounds.size.width); //correct, if new font size bigger than initial actualFontSize = actualFontSize < myLabel.font.pointSize ? actualFontSize : myLabel.font.pointSize;