web-dev-qa-db-ja.com

UIGraphicsGetCurrentContextとUIGraphicsBeginImageContext / UIGraphicsEndImageContext

私はiOSAPIのこれらの部分に不慣れであり、ここに私の心の中で無限ループを引き起こしているいくつかの質問があります

  1. ..BeginImageContextにサイズがあるのに、.. GetCurrentContextにサイズがないのはなぜですか? ..GetCurrentContextにサイズがない場合、どこに描画されますか?限界は何ですか?

  2. 画像用と一般的なグラフィック用の2つのコンテキストが必要なのはなぜですか?画像コンテキストはすでにグラフィックコンテキストではありませんか?分離の理由は何でしたか(私は自分が知らないことを知りたいと思っています)

20
Nihat

UIGraphicsGetCurrentContext()は、現在のグラフィックスコンテキストへの参照を返します。作成しません。これを覚えておくことが重要です。その観点から見ると、現在のコンテキストはグラフィックスコンテキストが作成されたときのサイズであるため、サイズパラメータは必要ないことがわかります。

UIGraphicsBeginImageContext(aSize)は、UIViewの_drawRect:_メソッドの外部でUIKitレベルでグラフィックスコンテキストを作成するためのものです。

ここでそれらを使用します。

UIViewのサブクラスがある場合は、次のようにそのdrawRect:メソッドをオーバーライドできます。

_- (void)drawRect:(CGRect)rect
{
    //the graphics context was created for you by UIView
    //you can now perform your custom drawing below

    //this gets you the current graphic context
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    //set the fill color to blue
    CGContextSetFillColorWithColor(ctx, [UIColor blueColor].CGColor);

    //fill your custom view with a blue rect
    CGContextFillRect(ctx, rect);
}
_

この場合、グラフィックスコンテキストを作成する必要はありませんでした。これは自動的に作成され、drawRect:メソッドでカスタム描画を実行できます。

ここで、別の状況では、drawRect:メソッドの外部でカスタム描画を実行したい場合があります。ここでは、UIGraphicsBeginImageContext(aSize)を使用します

あなたはこのようなことをすることができます:

_UIBezierPath *circle = [UIBezierPath
                        bezierPathWithOvalInRect:CGRectMake(0, 0, 200, 200)];  

UIGraphicsBeginImageContext(CGSizeMake(200, 200));

//this gets the graphic context
CGContextRef context = UIGraphicsGetCurrentContext();

//you can stroke and/or fill
CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
CGContextSetFillColorWithColor(context, [UIColor lightGrayColor].CGColor);
[circle fill];
[circle stroke];

//now get the image from the context
UIImage *bezierImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

UIImageView *bezierImageView = [[UIImageView alloc]initWithImage:bezierImage];
_

これがあなたのために物事を片付けるのに役立つことを願っています。また、UIGraphicsBeginImageContextWithOptions(size、opaque、scale)を使用する必要があります。グラフィックコンテキストを使用したカスタム描画の詳細については、私の回答を参照してください ここ

34
daveMac

ここで少し混乱しています。

名前が示すように、UIGraphicsGetCurrentContextはCURRENTコンテキストを取得するため、サイズは必要ありません。existingコンテキストを取得して、それを返します。

では、既存コンテキストはいつありますか?常に?いいえ。画面がフレームをレンダリングしているときに、コンテキストが作成されます。このコンテキストは、ビューを描画するために呼び出される_DrawRect:_関数で使用できます。

通常、関数はDrawRect:で呼び出されないため、実際に使用できるコンテキストはありません。これは、UIGraphicsBeginImageContextを呼び出すときです。

これを行うと、create画像コンテキストが作成され、UIGraphicsGetCurrentContextを使用してそのコンテキストを取得して操作できます。したがって、UIGraphicsEndImageContextで終了することを忘れないでください。

さらに明確にするために、_DrawRect:_のコンテキストを変更すると、変更内容が画面に表示されます。あなた自身の機能では、あなたの変更はどこにも現れません。 UIGraphicsGetImageFromCurrentImageContext()呼び出しを使用して、コンテキスト内の画像を抽出する必要があります。

お役に立てれば!

10
Jack