2013-09-23 4 views
5

複雑なpdfドキュメントを作成するために印刷された文字列のレイアウトを決定するために使用していた方法の多くは、iOS7では廃止されました。 sizeWithFont:ConstrainedTosize:lineBreakModeの罰金ですが、私は唯一の1本のライン上の私の文字列が何をしたい場合sizeWithFontの代わりに:ForWidth:lineBreakMode:

boundingRectWithSize:options:attributes: 

:ドキュメントは廃止されているすべてのsizeWithFont法の代替として使用するために、同じ方法を呼び出しますか?私は最大の高さに何を使うべきかわからないので、最初のパラメータの値として引き渡す矩形はありません。

これは、指定されたサイズに制限するときのものです。

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; 

私はのmaxHeightがわからない場合はどのように私はこれと同じ方法を使用し、または実際に、1行分の高さは、私が知るしようとしています正確に何ですか?

NSAttributedの文字列と自動レイアウトの互換性を向上させる理由を知りましたが、なぜこれらを非難するのですか?私の場合、置換は1または2であったところで4または5ステップを要します。

Tさんが示唆しているように、fontのlineHeightプロパティを使用して、これらのメソッドを大幅に単純化置換。あなただけの1行の高さを探している場合

#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 

答えて

15

、あなたは自分のフォントのlineHeightプロパティを使用することができませんでしたか?私はそれを使ってラベルの高さを設定したり、問題のない要素の高さを適切に予測したりします。私は、pdfの文書がこの点で異なっているかどうかはわかりません。

また、NSString + UIKitシリーズの一連の関数(sizeWithFont:...など)がスレッドセーフではないUIStringDrawingライブラリに基づいているため、これらの関数は非推奨と考えられます。他のUIKit機能と同様に、メインスレッドではなく、それらを実行しようとすると、予期しない動作が発生します。特に、複数のスレッドで同時に関数を実行すると、アプリがクラッシュする可能性があります。このため、iOS 6では、NSAttributedStringsのメソッドとしてboundingRectWithSize:...が導入されました。これはNSStringDrawingライブラリの上に構築され、スレッドセーフです。

iOS 6とiOS 7のみをサポートしていた場合は、NSStringのsizeWithFont:...をすべてNSAttributeStringのboundingRectWithSizeに変更します。それはあなたが奇妙なマルチスレッドコーナーケースを持っている場合、頭痛の多くを保存します!ここで私はNSStringののsizeWithFont:constrainedToSize:の変換方法は次のとおりです。

何にするために使用:

NSString *text = ...; 
CGFloat width = ...; 
UIFont *font = ...; 
CGSize size = [text sizeWithFont:font 
       constrainedToSize:(CGSize){width, CGFLOAT_MAX}]; 

を簡単に置き換えることができます:

NSString *text = ...; 
CGFloat width = ...; 
UIFont *font = ...; 
NSAttributedString *attributedText = 
    [[NSAttributedString alloc] 
     initWithString:text 
     attributes:@ 
     { 
      NSFontAttributeName: font 
     }]; 
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX} 
              options:NSStringDrawingUsesLineFragmentOrigin 
              context:nil]; 
CGSize size = rect.size; 

ドキュメントを注意してくださいすることは言及:IOSの

7以降では、このメソッドは小数点以下のサイズを返します(サイズ の戻り値のコンポーネントCGRect);戻りサイズを使用して ビューを表示するには、ceil関数を使用して、その値を最も近い上位整数 に上げる必要があります。

だから私が使用する、ビューのサイズを設定するために使用されるように計算され、高さや幅を引き出す:

CGFloat height = ceilf(size.height); 
CGFloat width = ceilf(size.width); 
+0

あなたの方法は、唯一私がクランプするCGRectIntegralマクロを使用し、ほとんどの鉱山と同じです値は整数になります。私は、行の高さのフォントを見ることは決して考えなかった。それが私の答えでした。私は以前のコードをより簡単に置き換えることができるようなカテゴリの新しいメソッドをいくつか作成しました。 –

+1

LineBreakModeはNSParagraphStyle属性で置き換えられ、属性辞書に追加できます。これを行う方法の詳細な例は、http://stackoverflow.com/a/26894770/338468を参照してください。 –