我使用cocoa编写了一个小的自定义视图应用程序。后来(是的,我知道这很糟糕)我只是问自己:这对可可有用吗?当然id不能立即工作,我不得不改变类名等等。好吧,只要需要,我就使用NSTimer
和setNeedsDisplay:
方法刷新视图。在可可下工作得很好,但绝对不能在可可触摸下。
我无法向自己解释,实际上我不知道哪些代码行可以帮助某人解决问题。也许这里是Timer:
[self setMyTimer: [NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(myTarget:) userInfo:nil repeats:YES]];
它的目标是:
- (void) myTarget:(NSTimer *)timer {
[self setNeedsDisplay];
}
每隔30毫秒调用一次计时器,我用NSLog检查了它。
在drawRect:
方法中,我实际上只绘制了一些形状而没有做任何其他事情。以防万一有必要调用某种clearRect:
方法。正如我所说,在可可之下它起作用了。
答案 0 :(得分:3)
以下是setNeedsDisplay
的文档中关于UIView
的讨论(请注意参数的缺失):
您可以使用此方法通知系统您的视图内容 需要重新绘制。此方法记录了请求和 立即将控制权返回给您的代码。视图不是 实际重绘直到下一个绘图周期,此时全部 无效的视图已更新。
您应该使用此方法请求仅在重定时重绘视图 视图的内容或外观发生变化。如果你只是改变了 视图的几何体,视图通常不会重绘。相反,它 现有内容根据视图中的值进行调整
contentMode
财产。重新显示现有内容的改进 通过避免重绘没有的内容的需要来实现性能 改变。
相比之下,这里是setNeedsDisplay:
的文档中关于NSView
(请注意参数)的讨论:
每当用于绘制视图对象的数据或状态发生变化时, 视图应发送
setNeedsDisplay:
消息。标记了NSView
个对象 因为需要显示会在每次传递时自动重新显示 应用程序的事件循环。 (查看需要重新显示的对象 在事件循环到来之前,当然可以立即发送 适当的显示...方法。)
答案 1 :(得分:3)
我首先使用断点或日志语句验证drawRect:
是否正在运行。
然后,确保您的视图实际上在屏幕上。 [self superview]
的价值是多少?您还应该执行self.backgroundColor = [UIColor redColor];
之类的操作,以便查看视图的位置。
仅仅因为你每隔30毫秒标记一次视图是脏的并不意味着每隔30毫秒会画一次。它通常应该(大约30fps),但没有保证。 drawRect:
不应该依赖于它的调用频率。从你的问题来看,我认为你的意思是它永远不会画画,而不是像往常那样经常画画。