Viele der Methoden, die ich verwendet habe, um das Layout gedruckter Zeichenfolgen für die Erstellung komplexer PDF-Dokumente zu bestimmen, sind in iOS7 veraltet. Dokumentation ruft die gleiche Methode, wie Ersatz zu verwenden für alle sizeWithFont Methoden, die veraltet sind:Ersatz für sizeWithFont: ForWidth: lineBreakMode:
boundingRectWithSize:options:attributes:
Das ist für sizeWithFont:ConstrainedTosize:lineBreakMode
in Ordnung ist, aber was ist, wenn ich möchte, dass meine Zeichenfolge in einer Zeile nur? Ich weiß nicht, was ich für die maximale Höhe verwenden soll, deshalb habe ich kein Rechteck als Wert für den ersten Parameter.
Hier ist, was ich habe, wenn Sie auf eine bestimmte Größe beschränken.
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;
Wie würde ich diese gleiche Methode verwenden, wenn ich die maxHeight weiß es nicht, oder tatsächlich, Höhe für eine Zeile ist genau das, was ich herausfinden möchte?
Ich sehe, warum sie in Richtung Kompatibilität für die NSAttributed Strings und Auto-Layout drängen, aber warum diese ablehnen? Das Ersetzen, in meinem Fall, dauert jetzt 4 oder 5 Schritte, wo es früher 1 oder 2 war.
Mit der LineHeight-Eigenschaft der Schriftart, wie von Herrn T vorgeschlagen, habe ich diese Methoden in einer Kategorie, die meine vereinfacht Ersatz.
#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
Ihre Methode so ziemlich das gleiche wie meine, nur verwende ich das CGRectIntegral Makro zu klemmen die Werte zu ganzen Zahlen. Ich habe nie gedacht, die Schriftart für die Zeilenhöhe zu betrachten. Das war die Antwort für mich. Ich benutzte es, um einige neue Methoden in einer Kategorie zu erstellen, die meinen früheren Code leichter ersetzen. –
LineBreakMode wird durch ein NSParagraphStyle-Attribut ersetzt, das zum Attributwörterbuch hinzugefügt werden kann. Ein detailliertes Beispiel dafür finden Sie unter http://stackoverflow.com/a/26894770/338468. –