Wiele metod, których używałem do określenia układu drukowanych ciągów do tworzenia złożonych dokumentów PDF, zostało wycofanych w iOS7. Dokumentacja wywołuje tę samą metodę, aby użyć go jako zamiennik dla wszystkich metod sizeWithFont które są nieaktualne:Zamiennik dla sizeWithFont: ForWidth: lineBreakMode:
boundingRectWithSize:options:attributes:
To dobrze dla sizeWithFont:ConstrainedTosize:lineBreakMode
ale co zrobić, jeśli chcę mój ciąg tylko na jednej linii? Nie wiem, co używać w przypadku maksymalnej wysokości, więc nie mam parametru "rect to przekazać" jako wartości pierwszego parametru.
Oto, co mam, ograniczając do danego rozmiaru.
CGFloat maxHeightAllowable = _maxHeight;
CGSize issueTitleMaxSize = CGSizeMake(_issueListTitleColWidth - (kColumnMargin *2), maxHeightAllowable);
NSDictionary *issueTitleAttributes = [NSDictionary dictionaryWithObjectsAndKeys:_bodyFont, NSFontAttributeName, nil];
CGRect issueTitleRect = CGRectIntegral([issueTitleText boundingRectWithSize:issueTitleMaxSize options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:issueTitleAttributes context:nil]);
CGSize issueTitleSize = issueTitleRect.size;
Jak bym stosować tę samą metodę, jeśli ja nie wiem maxheight, czy rzeczywiście, wysokość na jednej linii jest dokładnie to, co staram się dowiedzieć?
Widzę, dlaczego naciskają na kompatybilność łańcuchów NSAttributed i automatyczny układ, ale dlaczego je przestają? Zamiennik, w moim przypadku, teraz zajmuje 4 lub 5 kroków, gdzie był 1 lub 2.
Stosując właściwość lineHeight fontu, zgodnie z sugestią pana T, zrobiłem te metody w kategorii, która znacznie upraszcza moje zastąpienie.
#import "NSString+SizingForPDF.h"
@implementation NSString (SizingForPDF)
-(CGSize)integralSizeWithFont:(UIFont *)font constrainedToSize:(CGSize)maxSize
{
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil];
CGRect rect = CGRectIntegral([self boundingRectWithSize:maxSize options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:attributes context:nil]);
return rect.size;
}
-(CGSize)integralSizeWithFont:(UIFont *)font maxWidth:(CGFloat)maxWidth numberOfLines:(NSInteger)lines
{
if (lines == 0) {
lines = 1;
}
NSDictionary *attributes = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
CGFloat height = font.lineHeight * lines;
CGSize maxsize = CGSizeMake(maxWidth, height);
CGRect rect = CGRectIntegral([self boundingRectWithSize:maxsize options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesFontLeading attributes:attributes context:nil]);
return rect.size;
}
@end
Twoja metoda jest prawie taki sam jak mój, tylko używam makra CGRectIntegral do zaciskania wartości do liczb całkowitych. Nigdy nie myślałem, aby spojrzeć na czcionkę dla wysokości linii. To była odpowiedź dla mnie. Użyłem go do stworzenia kilku nowych metod w kategorii, która łatwiej zastąpi mój poprzedni kod. –
LineBreakMode zastępuje się atrybutem NSParagraphStyle, który można dodać do słownika atrybutów. Zobacz http://stackoverflow.com/a/26894770/338468 dla szczegółowego przykładu, jak to zrobić. –