2012-01-26 7 views
10

Sto provando a impaginare il testo su un UIView.iOS - Ottieni l'altezza "reale" di una lettera

(L'area gialla è la cornice di UILabel con un colore di sfondo).

Quando uso sizeWithFont io ottenere questo, che ha un grande spazio al di sopra della lettera:

p with sizeWithFont

Quando uso font.pointSize ottengo questo per "i", che è buono-

p with font.pointSize

mA quando lo uso per "p" ottengo l'altezza precisa, ma la lettera è tracciata nella bo ttom e ritagliata.

p with font.pointSize

** Come posso ottenere ottenere il glifo centrato solo nel telaio? **

Grazie

Shani

risposta

18

Ci sono un sacco di annunci sulla UIFont per aiutare in questa situazione:

  • pointSize
  • ascender
  • descender
  • capHeight
  • xHeight
  • lineHeight
+2

Sarebbe bello avere una foto quindi è ovvio come sono tutti definiti. Ad esempio, pointSize == ascender + discender ed è ascender> = capHeight? – Matt

+4

@Matt, è un vecchio, ma trovo molto utile l'immagine su https://www.cocoanetics.com/2010/02/understanding-uifont/. – Roy

3

Si potrebbe convertire il UILabel ad un UIImage con una sorta "PrintScreen" della funzione e quindi controllare il il pixel uno ad uno (con per esempio: How to get pixel data from a UIImage (Cocoa Touch) or CGImage (Core Graphics)?) e ' calcola 'la parte superiore sinistra en la parte inferiore destra.

+0

non è sicuramente necessario per convertire un'etichetta ad un UIImage, la risposta fornita da Jeff Kelly è meglio. Ci sono molti attributi che possono aiutarti a definire l'altezza esatta di una UILabel –

+1

Non sono d'accordo. Per alcuni tipi di carattere l'altezza per capitale (capHeight) differisce per carattere (vedi http://bit.ly/OtdxOe). Altre proprietà @ della classe 'UIFont' hanno gli stessi 'problemi'. Ho avuto un problema simile nello sviluppo di qualcosa in flash/as3. "Conteggio dei pixel" lo ha fatto per me alla fine. – basvk

2

Provare a spostare il testo verso l'alto da font.ascender - font.capHeight. Ridurre l'altezza di un UILabel probabilmente ne taglia il contenuto, quindi è meglio regolare la posizione y dell'etichetta anziché ridimensionarla.

L'esempio di codice seguente illustra il calcolo che ho usato:

// in UILabel subclass: 
- (CGFloat) topPadding 
{ 
    // ascender = height from baseline to top of label (including top padding) 
    // capHeight = height of a capital letter = ascender - top padding 
    // -> top padding = ascender - capHeight 
    return self.font.ascender - self.font.capHeight; 
}