【问题标题】:Overriding drawRect: and pushing new offset CGContexts onto the stack覆盖 drawRect: 并将新的偏移量 CGContexts 压入堆栈
【发布时间】:2009-12-20 22:18:28
【问题描述】:

我已经覆盖了UIView 中的drawRect:,我想绘制几个图块。我正在遍历它们,我有一个单独的函数来绘制每个单独的图块。

我现在的做法是将图块的计算 CGRect 传递给函数。目前,任何绘图方法都必须包含在绘制平铺图像时传递给它的矩形的 x 和 y 偏移量。

如何在调用 tile draw 方法之前将新的偏移量 CGContext 压入堆栈?

例如,我可以在 tile 绘制方法中在 [0, 0, 50, 50] 处绘制一个正方形,并且实际上会在正确的 tile 位置绘制?

【问题讨论】:

  • “压栈”是什么意思?

标签: iphone objective-c cocoa-touch core-graphics


【解决方案1】:

您应该利用 CTM(当前变换矩阵),它利用仿射变换将绘图缩放到上下文中。它正是为此目的而构建的。

  • 首先调用 CGContextSaveGState。这会将有关图形上下文的大量信息保存到(每个上下文)堆栈中,包括 CTM。
  • 其次,使用 CGContextTranslateCTM。传入矩形原点的 x 和 y 坐标。
  • 然后调用您的绘图子例程。
  • 最后,调用CGContextRestoreGState。这将撤消翻译。

希望对您有所帮助。

【讨论】:

  • 完美,这就是我想要的!知道这与堆栈有关 ;-)
  • 一个可能的改进:您不必保存和恢复每个图块周围的 gstate。您可以在整行之前CGContextSaveGState,将每个图块水平平移(垂直为零)tile-width 点,然后CGContextRestoreGState 回到行首并向下平移tile-height 指向下一行。
猜你喜欢
  • 2015-01-03
  • 2013-12-26
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多