CTFramesetterSuggestFrameSizeWithConstraints fonctionne correctement. La raison pour laquelle vous obtenez une hauteur trop courte est due à l'interlignage dans le style de paragraphe par défaut attaché aux chaînes attribuées. Si vous n'attachez pas de style de paragraphe à la chaîne, CoreText renvoie la hauteur nécessaire pour afficher le texte, mais sans espace entre les lignes. Cela m'a pris pour toujours à comprendre. Rien dans la documentation ne l'énonce. Je viens juste de remarquer que mes hauteurs étaient courtes d'un montant égal à (nombre de lignes x attendues menant). Pour obtenir le résultat de la hauteur que vous attendez, vous pouvez utiliser le code comme suit:
NSString *text = @"This\nis\nsome\nmulti-line\nsample\ntext."
UIFont *uiFont = [UIFont fontWithName:@"Helvetica" size:17.0];
CTFontRef ctFont = CTFontCreateWithName((CFStringRef) uiFont.fontName, uiFont.pointSize, NULL);
// When you create an attributed string the default paragraph style has a leading
// of 0.0. Create a paragraph style that will set the line adjustment equal to
// the leading value of the font.
CGFloat leading = uiFont.lineHeight - uiFont.ascender + uiFont.descender;
CTParagraphStyleSetting paragraphSettings[1] = { kCTParagraphStyleSpecifierLineSpacingAdjustment, sizeof (CGFloat), &leading };
CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(paragraphSettings, 1);
CFRange textRange = CFRangeMake(0, text.length);
// Create an empty mutable string big enough to hold our test
CFMutableAttributedStringRef string = CFAttributedStringCreateMutable(kCFAllocatorDefault, text.length);
// Inject our text into it
CFAttributedStringReplaceString(string, CFRangeMake(0, 0), (CFStringRef) text);
// Apply our font and line spacing attributes over the span
CFAttributedStringSetAttribute(string, textRange, kCTFontAttributeName, ctFont);
CFAttributedStringSetAttribute(string, textRange, kCTParagraphStyleAttributeName, paragraphStyle);
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(string);
CFRange fitRange;
CGSize frameSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, textRange, NULL, bounds, &fitRange);
CFRelease(framesetter);
CFRelease(string);
des progrès à ce sujet? – hfossli