为什么要使用UIGraphicsPushContext / UIGraphicsPopContext

时间:2012-11-08 12:53:26

标签: ios

我在MBProgressHUD(https://github.com/jdg/MBProgressHUD

中注意到以下代码
- (void)drawRect:(CGRect)rect {

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

我想知道“推送上下文”也是当前的上下文,为什么作者在绘制之前会推送上下文。

评论说:

  

使用UIGraphicsPushContext()& UIGraphicsPopContext()保存调用者图形上下文w.r.t.此drawRect的项目:可以设置   (https://github.com/jdg/MBProgressHUD/commit/06d5bf88b9afffa7142e543606917033f157ba5e

这是什么意思?

1 个答案:

答案 0 :(得分:2)

这是一个值得怀疑的事情,因为据我所知,它完全没有意义。以下是将要发生的事情的播放:

  1. 视图标记为脏,需要重新绘制
  2. 将创建图形上下文并在内部推送以供视图绘制。
  3. 作者通过UIGraphicsGetCurrentContext()
  4. 收到指向该上下文的指针
  5. 作者再次推出相同的背景。
  6. 作者做了一些绘画
  7. 作者从堆栈中弹出上下文(仍然保留相同的上下文)
  8. 在内部,再次弹出上下文堆栈。
  9. 作者可能认为他们需要避免破坏当前的图形上下文,但这不是一个有效的问题,因为每次为drawRect

    创建独占上下文

    据我所知,push和pop函数的原因是封装了专门的上下文,比如为drawRect创建的窗口上下文。您可以在内部创建它,将其推送到堆栈,外部类可以通过UIGraphicsGetCurrentContext()接收它,而无需了解其实现细节。完成后弹出它。

    保存和恢复G状态更类似于OpenGL用于捕捉回到之前的矩阵。