Во-первых, label.font
может быть не строка:
шрифт использовать, в настоящее время может быть либо CTFontRef, CGFontRef, или строка, обозначающая шрифт
Так что лучше выполнить некоторые проверки, если вы не установив его в коде (я напишу мой пример в ObjC, но это должно быть довольно просто, чтобы перевести его в Swift):
NSString* fontName;
CFTypeRef font = label.font;
if (CFGetTypeID(font) == CFStringGetTypeID())
{
fontName = (__bridge NSString *)(font);
}
else if (CFGetTypeID(font) == CGFontGetTypeID())
{
fontName = CFBridgingRelease(CGFontCopyFullName((CGFontRef)font));
}
else if (CFGetTypeID(font) == CTFontGetTypeID())
{
fontName = CFBridgingRelease(CTFontCopyFullName((CTFontRef)font));
}
Во-вторых, CATextLayer (в отличие от UILabel или функции рисования строки), кажется, использует высоту строки несколько отличается от 1 при рисовании содержимого строки, так что вы должны использовать стиль абзаца, чтобы правильно измерить:
NSMutableParagraphStyle* style = [[NSMutableParagraphStyle alloc] init];
style.lineHeightMultiple = 1.05;
NSDictionary* attributes = @{
NSFontAttributeName: [UIFont fontWithName:fontName size:label.fontSize],
NSParagraphStyleAttributeName: style
};
CGSize textSize = [str sizeWithAttributes:attributes];
мультипликатор 1,05 фактически выбран после некоторые эксперименты, и он неплохо подходит для разных размеров шрифта от 8 до 72.
может понравиться вам опубликовать код с вашими проблемами? –
@JoshuaSmith code добавлен – Arbitur
, пожалуйста, проверьте мой ответ http://stackoverflow.com/questions/19145078/ios-7-sizewithattributes-replacement-for-sizewithfontconstrainedtosize/35812617#35812617 – jenish