2012-11-08 57 views
2

我注意到下面的代碼在MBProgressHUD(https://github.com/jdg/MBProgressHUD爲什麼要用UIGraphicsPushContext/UIGraphicsPopContext

- (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

這是什麼意思

回答

2

那就是懷疑,因爲據我可以告訴它是毫無意義的一個有效的事呢?這是一齣戲,由播放會發生什麼:

  1. 視圖被標記爲髒,需要重新繪製
  2. 圖形上下文將被創建並繪製成圖內部推動。
  3. 作者收到一個指向該上下文的指針UIGraphicsGetCurrentContext()
  4. 作者再次推送相同的上下文。
  5. 筆者做了一些拉伸
  6. 筆者離開本層的情況下(同樣的情況下仍然)
  7. 內部,上下文棧被彈出一次。

作者可能的印象是,他們需要避免破壞當前圖形上下文中,但這不是因爲獨特的上下文中創建每次drawRect

的原因推一個有效的關注和彈出功能,據我所知,是封裝專門的上下文,如爲drawRect創建的窗口上下文。您可以在內部創建它,將其推入堆棧,並且外部類可以通過UIGraphicsGetCurrentContext()接收它,而無需知道其實現細節。完成後彈出它。

保存並恢復G狀態更類似於OpenGL用於捕捉回前一個矩陣。