有几篇帖子指出从CTFramesetterSuggestFrameSizeSithWithConstraints中获取精确高度的困难,在这里,(framesetter post),@ Chris DeSalvo给出了看似确定的修正:使用正确的行间距调整添加段落样式设置。 / p>
DeSalvo通过从其lineHeight移除UIFont的上升器和下降器来获得“领先”。我想知道这与CTFontGetLeading
相比如何。
我使用这样创建的字体:
CTFontRef fontr = CTFontCreateWithName((CFStringRef)@"Helvetica Neue", 16.0f, NULL);
UIFont *font = [UIFont fontWithName:@"Helvetica Neue" size:16.0f];
价值观完全不同:
以下是其他一些UIFont值:
以下是Ken Thomases询问的CTFont值:
我注意到UIFont以前有一个专门用于“领先”的属性,但它已被弃用,我们建议使用lineHeight
代替。因此,对于相同的字体,UIFont认为导致 21 和CTFontRef .448 ?有些事情不对。
三个问题:
答案 0 :(得分:2)
我也碰到了这个,这里是在一个真实项目中工作的代码:
// 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. This logic will ensure that the measured
// height for a given paragraph of attributed text will be accurate wrt the font.
- (void) applyParagraphAttributes:(CFMutableAttributedStringRef)mAttributedString
{
CGFloat leading = CTFontGetLeading(self.plainTextFont);
CTParagraphStyleSetting paragraphSettings[1] = {
kCTParagraphStyleSpecifierLineSpacingAdjustment, sizeof (CGFloat), &leading
};
CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(paragraphSettings, 1);
CFRange textRange = CFRangeMake(0, [self length]);
CFStringRef keys[] = { kCTParagraphStyleAttributeName };
CFTypeRef values[] = { paragraphStyle };
CFDictionaryRef attrValues = CFDictionaryCreate(kCFAllocatorDefault,
(const void**)&keys,
(const void**)&values,
sizeof(keys) / sizeof(keys[0]),
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
BOOL clearOtherAttributes = FALSE;
CFAttributedStringSetAttributes(mAttributedString, textRange, attrValues, (Boolean)clearOtherAttributes);
CFRelease(attrValues);
CFRelease(paragraphStyle);
self.stringRange = textRange;
return;
}
答案 1 :(得分:0)
我上面提到的3个问题的答案:
CTFontGetLeading(fontRef)
获取字体的正常值,或插入您选择的任何值(作为CGFloat)。答案1和2有效:指定属性字符串的paragraphStyle属性中的前导值将使Core-Text框架集能够计算其高度完全。
有两点需要注意:
还有一个谜团:UIFont被弃用的领导是怎么回事?领先和lineHeight是两个不同的东西。