【问题标题】:Using CGRect and setNeedsDisplay使用 CGRect 和 setNeedsDisplay
【发布时间】:2012-01-21 20:16:07
【问题描述】:

如何覆盖 UIView 的 drawRect 方法,以便每次调用 [myView setNeedsDisplay] 时,它都会在屏幕上绘制一个随机颜色的新圆圈。它不应该取代旧的圈子。所以,它应该看起来就像一堆圆圈在屏幕上一个接一个地堆叠起来。

【问题讨论】:

  • 你的意思是drawRect而不是CGRect?
  • 是的,感谢您指出这一点。已编辑。

标签: iphone ios ipad uiview cgrect


【解决方案1】:

您不能以这种方式使用drawRect:。它旨在在该矩形内绘制 整个 视图,因此您必须一次绘制所有球,而不仅仅是您要添加的球。每次调用 drawRect 时,您正在绘制的屏幕区域已经被清除了之前的状态。

我最初的想法是为每个单独的球创建一个具有随机大小和位置的视图。但是 SonOfSillyBalls 示例代码(它完全符合您的要求)采用了不同的方法。

它的NSView 子类设置了一个重复计时器来触发drawAnother: 方法,该方法执行[self lockFocus],然后随机绘制一个球,然后[self unlockFocus] 完成绘制。最后,它调用[self.window flushWindow] 将新球放到屏幕上。

因为它完全做了你想做的事,也许你不应该读它(挑战在哪里!),但 SonOfSillyBalls 的示例代码在这里:http://developer.apple.com/library/mac/#samplecode/SonOfSillyBalls/

您可能想查看自述文件以了解总体问题以及为什么它不适合现代绘图 API(注意:它很旧,因此在某些地方它将 Mac OS X 称为“开放步骤”和“Rhapsody”(还没有发明“X”这个名字)和 Classic Mac OS 就像“Mac OS”)

Silly Balls 是 Apple 最古老的示例代码之一,最初可以追溯到 1980 年代,但这是第三次(我认为?)修订版,仅在六个月前更新为使用 Objective-C 2.0。

【讨论】:

  • UIView 没有 lockFocus 方法或等效方法。
  • 嗯,这很好。我猜那替代方案可能是使用CALayer(为每个球添加一层)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多