11

iOS7 のリリースに伴い、以下の機能が廃止されました。

drawAtPoint:forWidth:withFont:minFontSize:actualFontSize:lineBreakMode:baselineAdjustment:

Appleのドキュメントでは、使用することを提案しています

drawInRect:withAttributes:

この関数を使用する理由は<code>minFontSize</code>、rect 内に文字列を描画できるパラメーターのためです。

テキストが収まらない場合は、まずテキスト サイズを縮小し、<code>minFontSize</code>収まらない場合は切り捨てます。

これまでのところ、を使用してこれを達成することはできません<code>drawInRect:withAttributes:</code>

<code>minFontSize</code>同等のものを決定するためにどのキーを使用できますか?

4

4 に答える 4

12

以前よりも少し複雑で、最小フォント サイズを使用することはできませんが、最小フォント スケール ファクターを使用する必要があります。iOS SDK にもバグがあり、ほとんどのユース ケースで問題が発生します (下部のメモを参照)。これがあなたがしなければならないことです:

// Create text attributes
NSDictionary *textAttributes = @{NSFontAttributeName: [UIFont systemFontOfSize:18.0]};

// Create string drawing context
NSStringDrawingContext *drawingContext = [[NSStringDrawingContext alloc] init];
drawingContext.minimumScaleFactor = 0.5; // Half the font size

CGRect drawRect = CGRectMake(0.0, 0.0, 200.0, 100.0);
[string drawWithRect:drawRect
             options:NSStringDrawingUsesLineFragmentOrigin
          attributes:textAttributes
             context:drawingContext];

ノート:

  • 少なくともバージョン 7.0.3 までの iOS 7 SDK にはバグがあるようです: 属性でカスタム フォントを指定すると、miniumScaleFactor が無視されます。属性に nil を渡すと、テキストは正しくスケーリングされます。

  • NSStringDrawingUsesLineFragmentOriginオプションは重要です。テキスト描画システムに、描画四角形の原点が左上隅にある必要があることを伝えます。

  • 新しいメソッドを使用してbaselineAdjustmentを設定する方法はありません。最初に呼び出してからboundingRectWithSize:options:attributes:context:、 rect に渡す前に rect を調整して、自分でそれを行う必要がありますdrawWithRect:options:attributes:context

于 2013-11-05T11:47:14.867 に答える
1

長い間グーグルで調べた後、iOS7 で動作するソリューションが見つかりませんでした。

現在、私は次の回避策を使用していますが、それが非常に醜いことを知っています。

UILabel をメモリにレンダリングし、スクリーンショットを撮って描画します。

UILabel はテキストを正しく縮小できます。

おそらく誰かがそれを便利だと思うでしょう。

UILabel *myLabel = [[UILabel alloc] initWithFrame:myLabelFrame];
myLabel.font = [UIFont fontWithName:@"HelveticaNeue-BoldItalic" size:16];
myLabel.text = @"Some text that is too long";
myLabel.minimumScaleFactor = 0.5;
myLabel.adjustsFontSizeToFitWidth = YES;
myLabel.backgroundColor = [UIColor clearColor];

UIGraphicsBeginImageContextWithOptions(myLabelFrame.size, NO, 0.0f);
[[myLabel layer] renderInContext:UIGraphicsGetCurrentContext()];
UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[screenshot drawInRect:myLabel.frame];
于 2014-02-09T22:11:44.827 に答える