2011-06-14 27 views
6

Kod, bit bir değişiklikle SimpleTextInput sampe code'dan ayıklanır.CTLineGetTypographicBounds Sorunları

çerçeve oluşturma:

self.font = [UIFont systemFontOfSize:18.f]; 
CTFontRef ctFont = CTFontCreateWithName((CFStringRef) self.font.fontName, self.font.pointSize, NULL);   
self.attributes = [[NSDictionary dictionaryWithObject:(id)ctFont forKey:(NSString *)kCTFontAttributeName] retain]; 
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:self.text attributes:self.attributes];  

_framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attributedString); 

// Create the Core Text frame using our current view rect bounds 
UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.bounds]; 
_frame = CTFramesetterCreateFrame(_framesetter, CFRangeMake(0, 0), [path CGPath], NULL); 

hat aşağıdaki çerçevenin herhangi bir hattıdır (CTFrameGetLines(_frame) almak): CTLineGetTypographicBounds elde

  1. yükselişini:

    CGFloat ascent, descent, leading; 
    CTLineGetTypographicBounds(line, &ascent, &descent, &leading); 
    CGPoint origin; 
    CTFrameGetLineOrigins(_frame, CFRangeMake(i, 1), &origin); 
    

    Sorunları veya ctFont 13.860352 iken self.font.ascender 16 yaşında 0,860352. Bu 3 puan tutarsızlığı nereden geliyor?

  2. descent 4.139648, lider 0'dır, yani çıkış + iniş + lider = 18, ancak self.font.lineEğri çizgi ve bitişik çizgi kökenleri çıkarılarak hesaplanan çizgi yüksekliği 22'dir. Bu 4 nokta uyuşmazlığı nereden geliyor?
+0

benim cömertlik ilgili bir yorum lider bir sıfır var neden hala alamadım - Hatta bir diyagram gibi olsa http://www.cocoanetics.com/2010/02/understanding-uifont/ en iyi cevap olurdu, basitçe sorulan soruya cevap vermek zaten çok büyük bir yardım olurdu. –

+0

UIFont'un neden böyle çalıştığını bilmiyorum, ancak Google çalışanlarına göre, satır boyutlarındaki ve 3 boyutundaki farkın tipografik sınırlarla karşılaştırılması, Hesaplama satırında satır metriklerine yoğunlaşan Çekirdek Metin'den kaynaklanıyor. kökenleri. En azından OS X'deki durum bu ... Henüz anlamadığım şartlar, ama yükselmeye 0.2 * (iniş + iniş) eklendiğini ve hem sonuçta ortaya çıkan yükselme hem de inişin katlanmasını biliyorum (x + 0.5)) ayrı koşullarla ayrı adımlarda. Belki UIFont bu değişiklikleri dahili olarak dikkate alıyor? – andlabs

+0

Her iki durumda da, bir CTFrame boyutunun CTLinesinin toplamı olmadığını varsaymamız gerektiğini tahmin ediyorum. Bunun herhangi bir yerde açıkça belirtilip belirtilmediğini bilmiyorum. – andlabs

cevap