Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c setNeedsDisplay*总是*重新绘制吗?_Objective C_Cocoa Touch_Cocoa_Custom View_Setneedsdisplay - Fatal编程技术网

Objective c setNeedsDisplay*总是*重新绘制吗?

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

我使用cocoa编写了一个小型自定义视图应用程序。后来(是的,我知道这很糟糕)我问自己:这对cocoa touch也有用吗?当然,id不能立即工作,我必须更改类名等等。好的,我使用
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