Molti dei metodi che stavo usando per determinare il layout delle stringhe stampate per la creazione di documenti PDF complessi sono stati deprecati in iOS7. Documentazione chiama lo stesso metodo da utilizzare come ricambio per tutti i metodi sizeWithFont che sono obsoleti:Sostituzione per sizeWithFont: ForWidth: lineBreakMode:
boundingRectWithSize:options:attributes:
che è bene per sizeWithFont:ConstrainedTosize:lineBreakMode
, ma cosa succede se voglio la mia stringa su una sola riga? Non so cosa usare per l'altezza massima, quindi non ho un rect da consegnare come valore per il primo parametro.
Ecco cosa ho quando si limita a una determinata dimensione.
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;
Come vorrei utilizzare questo stesso metodo se non so il maxHeight, o in realtà, l'altezza di una riga è esattamente quello che sto cercando di scoprire?
Capisco perché stanno spingendo verso la compatibilità per le stringhe NSA e il layout automatico ma perché deprecano questi? La sostituzione, nel mio caso, ora vogliono 4 o 5 passaggi dove è usato per essere 1 o 2.
Usando la proprietà lineHeight di carattere, come suggerito da Mr T, ho fatto questi metodi in una categoria che semplifica notevolmente la mia sostituzione.
#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
Il tuo metodo è più o meno uguale al mio, solo io uso la macro CGRectIntegral per bloccare i valori in numeri interi. Non ho mai pensato di guardare il font per l'altezza della linea. Questa è stata la risposta per me. L'ho usato per creare un paio di nuovi metodi in una categoria che sostituisce più facilmente il mio codice precedente. –
LineBreakMode è sostituito da un attributo NSParagraphStyle che può essere aggiunto al dizionario degli attributi. Vedi http://stackoverflow.com/a/26894770/338468 per un esempio dettagliato di come farlo. –