2012-01-26 13 views
10

Próbuję układać tekst na UIView.iOS - Uzyskaj "prawdziwą" wysokość litery

(Żółty obszar jest ramką UILabel z kolorem tła).

Gdy używam sizeWithFont uzyskać to, co ma bardzo dużą przestrzeń nad literę:

p with sizeWithFont

Gdy używam font.pointSize uzyskać to za "i" co jest dobre-

p with font.pointSize

aLE Gdy używam go na „P” I dostać dokładną wysokość, ale pismo jest zasysane BO ttom i przycięte.

p with font.pointSize

** Jak mogę dostać się glif tylko w ramce? **

Dzięki

Shani

Odpowiedz

18

Istnieje wiele właściwości na UIFont pomóc w tej sytuacji:

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

Byłoby miło mieć zdjęcie, więc jest oczywiste, co one wszystkie są zdefiniowane jako. Na przykład, czy pointSize == ascender + descender i iscender> = capHeight? – Matt

+4

@Matt, to oled, ale obraz na https://www.cocoanetics.com/2010/02/understanding-uifont/ jest bardzo pomocny. – Roy

3

Można przekonwertować UILabel do UIImage z „PrintScreen” rodzaj funkcji, a następnie sprawdzić pikseli jeden po drugim (na przykład z: How to get pixel data from a UIImage (Cocoa Touch) or CGImage (Core Graphics)?) i " obliczyć "lewy górny i prawy dolny.

+0

na pewno nie jest to konieczne w celu przekształcenia etykiety do UIImage, odpowiedzi udzielonej przez Jeff Kelly jest lepsza. Istnieje wiele atrybutów, które mogą pomóc w zdefiniowaniu dokładnej wysokości UILabel –

+1

Nie zgadzam się. W przypadku niektórych czcionek wysokość na kapitał (capHeight) różni się w zależności od postaci (patrz http://bit.ly/OtdxOe). Inne właściwości @ klasy 'UIFont' mają takie same" problemy ". Miałem podobny problem przy tworzeniu czegoś w flash/as3. "Zliczanie pikseli" zrobiło to dla mnie na końcu. – basvk

2

Spróbuj przenieść tekst w górę za pomocą font.ascender - font.capHeight. Zmniejszenie wysokości pliku UILabel prawdopodobnie spowoduje skasowanie jego zawartości, dlatego lepiej dopasować pozycję etykiety zamiast zmiany rozmiaru.

Poniższy przykładowy kod wyjaśnia obliczeń użyłem:

// 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; 
} 
Powiązane problemy