2

MBProgressHUD(https://github.com/jdg/MBProgressHUD)の以下のコードに気づきました

- (void)drawRect:(CGRect)rect {

    CGContextRef context = UIGraphicsGetCurrentContext();
    UIGraphicsPushContext(context);
    //do something
    UIGraphicsPopContext();
}

「プッシュされたコンテキスト」も現在のコンテキストであるのだろうかと思いますが、なぜ作者は描画する前にコンテキストをプッシュするのでしょうか。

コメントは言う:

UIGraphicsPushContext()とUIGraphicsPopContext()を使用して、このdrawRect:が設定する可能性のあるアイテムの呼び出し元のグラフィックコンテキストを保持します(https://github.com/jdg/MBProgressHUD/commit/06d5bf88b9afffa7142e543606917033f157ba5e

どういう意味ですか?</ p>

4

1 に答える 1

2

私が知る限り、それはまったく無意味なので、それは当然のことです。これが何が起こるかの実況です:

  1. ビューはダーティとしてマークされており、再描画する必要があります
  2. グラフィック コンテキストが作成され、ビューが描画されるように内部的にプッシュされます。
  3. 作成者は、そのコンテキストへのポインターを次の方法で受け取ります。UIGraphicsGetCurrentContext()
  4. 作成者は同じコンテキストを再度プッシュします。
  5. 著者はいくつかの描画を行います
  6. 作成者はスタックからコンテキストをポップします (同じコンテキストが残ります)
  7. 内部的に、コンテキスト スタックがもう一度ポップされます。

作成者は、現在のグラフィックス コンテキストを壊さないようにする必要があるという印象を持っているかもしれませんが、毎回排他的なコンテキストが作成されるため、これは正当な懸念事項ではありません。drawRect

私が知る限り、プッシュ関数とポップ関数の理由は、.NET 用に作成されたウィンドウ コンテキストのような特殊なコンテキストをカプセル化するためdrawRectです。内部で作成してスタックにプッシュすると、外部クラスはUIGraphicsGetCurrentContext()実装の詳細を知らなくてもそれを受け取ることができます。完了したらポップします。

G 状態の保存と復元は、以前のマトリックスにスナップバックするための OpenGL の使用に似ています。

于 2012-11-08T15:00:20.317 に答える