2014-12-08 2 views
1

Im использует sizeWithAttributes(), чтобы получить размер строки с \n. Он работает до нескольких 5 \n, а затем начинает возвращать половину линии слишком низко на высоте, поэтому последняя строка разрезается пополам (---).sizeWithAttributes() не дает мне правильную высоту после нескольких строк разрыва

Есть ли другие атрибуты, кроме шрифта, которые помогут мне в моей ситуации?

Код:

str = "text\ntext\ntext\ntext\ntext" 
label = CATextLayer() 
label. ... 

let textSize = str.uppercaseString.sizeWithAttributes([NSFontAttributeName:UIFont(name: label.font as String, size: label.fontSize)!]) 
+0

может понравиться вам опубликовать код с вашими проблемами? –

+0

@JoshuaSmith code добавлен – Arbitur

+0

, пожалуйста, проверьте мой ответ http://stackoverflow.com/questions/19145078/ios-7-sizewithattributes-replacement-for-sizewithfontconstrainedtosize/35812617#35812617 – jenish

ответ

0

Во-первых, 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.

+0

Это был атрибут, который был необходим, спасибо! Я знал, что это был какой-то атрибут, который мне не хватало для этой цели, но не знал, какой из них. :) – Arbitur

Смежные вопросы