2012-01-26 10 views
10

UIViewでテキストをレイアウトしようとしています。iOS - 文字の実際の高さを取得する

(黄色の領域は、背景色を持つUILabelのフレームです)。

私はsizeWithFontを使用する場合、私は手紙上記の非常に大きなスペースを有し、これを取得:

p with sizeWithFont

私はfont.pointSizeを使用する場合、私は

をgood-される "i" のためにこれを取得しますp with font.pointSize

しかし 私は「P」のためにそれを使用する場合、私は正確な高さを取得しますが、文字がBOに描かれていますttomして切り取った。

p with font.pointSize

**どのように私は、フレームの中央にグリフをゲットすることができますか? **

おかげ

シャニー

答えて

18

このような状況で支援するUIFontのプロパティがたくさんあります:

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

写真があるといいですね。それで、すべてが定義されていることは明らかです。例えば、pointSize == ascender + descenderで、ascender> = capHeightですか? – Matt

+4

@Matt、それは懐かしいですが、私はhttps://www.cocoanetics.com/2010/02/understanding-uifont/で画像を見つけるのがとても助かります。 – Roy

3

あなたは機能の「PrintScreenを」ソートでUIImageUILabelを変換し、ピクセル一つ一つ(例えばと:How to get pixel data from a UIImage (Cocoa Touch) or CGImage (Core Graphics)?)をチェックすることができますと '左上と右下を計算してください。

+0

それはUIImageにラベルを変換するために絶対に必要はありません、ジェフ・ケリーが提供する答えは良いです。私はUILabel –

+1

の正確な高さを定義するのに役立つ多くの属性があります。いくつかのフォントでは、1文字あたりの高さ(capHeight)は文字ごとに異なります(http://bit.ly/OtdxOeを参照)。 'UIFont'クラスの他の@propertiesにも同じ問題があります。私はflash/as3で何かを開発するときに同様の問題を抱えています。 "ピクセルを数えて"私のために最後にしました。 – basvk

2

font.ascender-font.capHeightでテキストを上に移動してみてください。 UILabelの高さを縮小すると内容がクリップされる可能性があるので、サイズ変更する代わりにラベルのy位置を調整する方が良いでしょう。

次のサンプル・コードでは、私が使用した計算を説明します

// 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; 
} 
関連する問題