Objective c setNeedsDisplay*总是*重新绘制吗?
我使用cocoa编写了一个小型自定义视图应用程序。后来(是的,我知道这很糟糕)我问自己:这对cocoa touch也有用吗?当然,id不能立即工作,我必须更改类名等等。好的,我使用Objective c setNeedsDisplay*总是*重新绘制吗?,objective-c,cocoa-touch,cocoa,custom-view,setneedsdisplay,Objective C,Cocoa Touch,Cocoa,Custom View,Setneedsdisplay,我使用cocoa编写了一个小型自定义视图应用程序。后来(是的,我知道这很糟糕)我问自己:这对cocoa touch也有用吗?当然,id不能立即工作,我必须更改类名等等。好的,我使用NSTimer和setNeedsDisplay:方法在需要时刷新视图。在cocoa下工作得很好,但在cocoa touch下绝对不行 我无法向自己解释,实际上我不知道哪行代码可以帮助别人解决这个问题。也许这是计时器: [self setMyTimer: [NSTimer scheduledTimerWithTimeIn
NSTimer
和setNeedsDisplay:
方法在需要时刷新视图。在cocoa下工作得很好,但在cocoa touch下绝对不行
我无法向自己解释,实际上我不知道哪行代码可以帮助别人解决这个问题。也许这是计时器:
[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:
方法。正如我所说,在cocoa下,它起了作用。以下是关于setNeedsDisplay
(注意缺少参数)的讨论,来自UIView
的文档:
您可以使用此方法通知系统您的视图的内容
需要重新绘制。此方法记录请求和请求
立即将控件返回到代码。观点并非如此
实际上重新绘制,直到下一个绘制周期,此时所有
将更新无效的视图
您应该使用此方法请求仅在以下情况下重新绘制视图:
视图的内容或外观将更改。如果你只是简单地改变
在视图的几何图形中,通常不会重新绘制视图。相反,它是
现有内容将根据视图中的值进行调整
contentMode
属性。重新显示现有内容可以提高性能
通过避免需要重新绘制尚未绘制的内容来提高性能
变了
与此相反,这里是关于setNeedsDisplay:
(注意参数)的讨论,来自NSView
:
每当用于绘制视图对象的数据或状态发生更改时
视图应发送一条setNeedsDisplay:
消息<代码>NSView标记的对象
在每次通过时自动重新显示所需的显示
应用程序的事件循环。(查看需要重新显示的对象)
在事件循环出现之前,当然可以立即发送
适当的显示…方法。)
以下是关于
UIView
文档中的setNeedsDisplay
(注意缺少参数)的讨论:
您可以使用此方法通知系统您的视图的内容
需要重新绘制。此方法记录请求和请求
立即将控件返回到代码。观点并非如此
实际上重新绘制,直到下一个绘制周期,此时所有
将更新无效的视图
您应该使用此方法请求仅在以下情况下重新绘制视图:
视图的内容或外观将更改。如果你只是简单地改变
在视图的几何图形中,通常不会重新绘制视图。相反,它是
现有内容将根据视图中的值进行调整
contentMode
属性。重新显示现有内容可以提高性能
通过避免需要重新绘制尚未绘制的内容来提高性能
变了
与此相反,这里是关于setNeedsDisplay:
(注意参数)的讨论,来自NSView
:
每当用于绘制视图对象的数据或状态发生更改时
视图应发送一条setNeedsDisplay:
消息<代码>NSView标记的对象
在每次通过时自动重新显示所需的显示
应用程序的事件循环。(查看需要重新显示的对象)
在事件循环出现之前,当然可以立即发送
适当的显示…方法。)
我将首先使用断点或log语句验证
drawRect:
是否正在运行
然后,确保您的视图实际显示在屏幕上。[self superview]
的值是多少?您还应该执行类似于self.backgroundColor=[UIColor redColor]代码>以便您可以查看视图所在的位置
仅仅因为每30毫秒将视图标记为脏视图并不意味着它将每30毫秒绘制一次。通常应该是这样(大约30帧/秒),但没有保证
drawRect:
不应该依赖于调用它的频率。根据您的问题,我假设您的意思是它从未绘制,而不是没有按照预期的频率绘制。我将首先使用断点或日志语句验证drawRect:
是否正在运行
然后,确保您的视图实际显示在屏幕上。[self superview]
的值是多少?您还应该执行类似于self.backgroundColor=[UIColor redColor]代码>以便您可以查看视图所在的位置
仅仅因为每30毫秒将视图标记为脏视图并不意味着它将每30毫秒绘制一次。通常应该是这样(大约30帧/秒),但没有保证
drawRect:
不应该依赖于调用它的频率。从你的问题来看,我想你的意思是,它从不画画,而不是像预期的那样经常画画。试试[self-setNeedsDisplay:YES]
.see@WTP:This似乎出现在iPhone上,它没有setNeedsDisplay:
方法,只有参数较少的setNeedsDisplay
(这很有意义,因为我认为我从来没有写过setNeedsDisplay:NO
,除非有一次我想知道它是否做了什么)。试试[self-setNeedsDisplay:YES];
。请看@WTP:This似乎出现在iPhone上,它没有setNeedsDisplay:
方法,只具有较少的参数setNeedsDisplay
(这很有意义,因为我认为除了一个之外,我从来没有写过setNeedsDisplay:NO
)