2012-01-26 16 views
10

UIView'deki metni düzenlemeye çalışıyorum.iOS - Bir harfin "gerçek" yüksekliğini alın

(Sarı alan, arka plan rengiyle UILabel'ın çerçevesidir). Ben sizeWithFont kullandığınızda

Ben harfi üzerinde çok büyük bir alana sahip olan bu olsun: Ben font.pointSize kullandığınızda

p with sizeWithFont

i iyi- "i" olan bu olsun

i "p" için kullandığınızda p with font.pointSize

aNCAK ben kesin yüksekliği elde ancak mektup bo çizilir ttom ve kırpılmış.

p with font.pointSize

** Nasıl sadece çerçevenin merkezine glif almak alabilirim? **

Teşekkür

Shani

cevap

18

bu durumda yardım etmeye UIFont üzerine özelliklerin bir yeri vardır:

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

Bir resme sahip olmak güzel olurdu, bu yüzden hepsinin tanımlandığı gibi görünüyor. Örneğin, pointSize == ascender + descender ve ascender> = capHeight mı? – Matt

+4

@Matt, bu bir oldy, ama ben https://www.cocoanetics.com/2010/02/understanding-uifont/ üzerinde görüntüyü bulmak çok yararlı. – Roy

3

Sen (örneğin ile: How to get pixel data from a UIImage (Cocoa Touch) or CGImage (Core Graphics)?) fonksiyonunun bir "PrintScreen" tür bir UIImage için UILabel dönüştürmek ve daha sonra tek pikselleri tek kontrol edebilir ve ' 'sol üst en sağ altını hesaplayın.

+0

bir UIImage Jeff Kelly iyidir tarafından sağlanan cevaba bir etiket dönüştürmek için kesinlikle zorunlu değildir:

Aşağıdaki kod örneği kullandığım hesaplama açıklar. Katıldığım UILabel –

+1

tam yüksekliğini tanımlamanıza yardımcı olabilecek birçok özellik var. Bazı yazı tiplerinde, sermaye başına yükseklik (capHeight) karakter başına farklılık gösterir (bkz. Http://bit.ly/OtdxOe). UIFont sınıfının diğer @ özellikleri, aynı sorunlara sahiptir. Flash/as3'te bir şey geliştirirken benzer bir sorun yaşadım. Sonunda benim için "piksel sayma" yaptı. – basvk

2

Metni font.ascender - font.capHeight ile yukarı taşımaya çalışın. UILabel'in yüksekliğini küçültmek, içeriklerini büyük olasılıkla kırpacaktır, bu yüzden etiketin yeniden boyutlandırmak yerine y konumunu ayarlamak daha iyidir.

// 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; 
}