Nadanie Framesetter poprawnej regulacji odstępów między wierszami

Kilka postów zauważyło trudności z uzyskaniem dokładnej wysokości z CTFramesetterSuggestFrameSizeWithConstraints i tutaj,(post framesetter), @Chris DeSalvo daje to, co wygląda jak ostateczna poprawka: dodaj ustawienie stylu akapitowego z poprawną regulacją odstępów między wierszami.

DeSalvo otrzymuje swoje „prowadzenie”, usuwając ascender i descender UIFont z jego lineHeight. Zastanawiałem się, jak by się to mogło równaćCTFontGetLeading.

Pracowałem z czcionkami utworzonymi w ten sposób:

<code>CTFontRef fontr = CTFontCreateWithName((CFStringRef)@"Helvetica Neue", 16.0f, NULL);
UIFont *font = [UIFont fontWithName:@"Helvetica Neue" size:16.0f];
</code>

Wartości były zupełnie inne:

0,448 CTFontGetLeading2.360 Wzór DeSalvo: UIFont lineHeight - ascender + descender

Oto kilka innych wartości UIFont:

21 000 linii UIFont15.232 ascender UIFont (współrzędna Y od linii bazowej)-3.408 Zejście UIFont (współrzędna Y od linii bazowej)08.368 xHeight UIFont

A oto wartości CTFont, o które pytał Ken Thomases:

11.568001 CTFontGetCapHeight08.368 CTFontGetXHeight-15.216001, -7.696001, 38.352001, 24.928001 CTFontGetBoundingBox15.232 CTFontGetAscent03.408 CTFontGetDescent (klasa ref mówi „skalowana metryka czcionka-zejście skalowana zgodnie z rozmiarem punktu i macierzą odniesienia czcionki” - co najwyraźniej oznacza, że ​​jest to wartość bezwzględna współrzędnej Y z linii bazowej?)

Zwracam uwagę, że UIFont wcześniej posiadał właściwość specjalnie do „prowadzenia”, ale została ona uznana za przestarzałą i zalecamy korzystanie z niejlineHeight zamiast. Więc UIFont uważa prowadzenie za być21 i CTFontRef.448 za tę samą czcionkę? Cos jest nie tak.

Trzy pytania:

Czy „prowadzenie” naprawdę oznacza kCTParagraphStyleSpecifierLineSpacingAdjustment?Jeśli tak, jaką metodę / formułę należy użyć, aby ją uzyskać?Jeśli nie, co powinienem użyć do regulacji odstępów między wierszami?

questionAnswers(2)

yourAnswerToTheQuestion