2

我注意到 MBProgressHUD 中的以下代码(https://github.com/jdg/MBProgressHUD

- (void)drawRect:(CGRect)rect {

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

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

评论说:

使用 UIGraphicsPushContext() 和 UIGraphicsPopContext() 来保存调用者图形上下文 wrt 这个 drawRect: 可能设置的项目 ( https://github.com/jdg/MBProgressHUD/commit/06d5bf88b9afffa7142e543606917033f157ba5e )

什么意思?</p>

4

1 回答 1

2

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

  1. 视图被标记为脏,需要重绘
  2. 将创建一个图形上下文并在内部推送以供视图绘制。
  3. 作者通过以下方式接收到指向该上下文的指针UIGraphicsGetCurrentContext()
  4. 作者再次推送相同的上下文。
  5. 作者画了一些
  6. 作者将上下文从堆栈中弹出(仍然保留相同的上下文)
  7. 在内部,上下文堆栈再次弹出。

作者可能认为他们需要避免破坏当前的图形上下文,但这不是一个有效的问题,因为每次都会创建一个独占上下文drawRect

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

保存和恢复 G 状态更类似于 OpenGL 用于恢复到先前矩阵的用途。

于 2012-11-08T15:00:20.317 回答