我用它来移动我的形象:
meteorDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(moveImage:)];
这是我的moveImage:
方法:
-(void) moveImage:(CADisplayLink *)sender{
CGPoint img;
imgLocation = imgImageView.center;
if (img < 100) {
img.y++;
}
else{
imgLocation.y = 0;
}
imgImageView.center = imgLocation;
}
无论如何,这都会更新我的图像在屏幕上的位置。为什么setNeedsDisplay
在这里没有效果?有什么意义setNeedsDisplay
?
答案 0 :(得分:3)
我认为imgImageView
是UIImageView
的一个实例。如果不是 UIImageView
的实例,请修改您的问题,告诉我们它是什么。
更改视图的center
属性永远不会要求您的应用重绘视图。显示服务器(在iOS 6中是一个名为backboardd
且在早期版本中为springboard
的单独进程)已经拥有视图像素数据的副本。当您更改视图的center
时,视图会通知显示服务器其新位置,并且显示服务器会将视图的像素数据复制到屏幕的相应部分。
因此,更改视图的center
属性绝不需要您发送setNeedsDisplay
。
更具体地说,UIImageView
甚至没有实现drawRect:
。相反,UIImageView
只是在设置图像时将其图像的像素数据发送到显示服务器。因此,即使您将setNeedsDisplay
发送给UIImageView
,它仍然无法运行任何drawRect:
方法。
顺便说一句,您也可以在自己的UIView
子类中执行此操作,方法是将self.layer.contents
设置为CGImageRef
,而不是实施drawRect:
。您需要#import <QuartzCore/QuartzCore.h>
才能执行此操作。当然,UIImageView
也会做其他事情,比如处理动画和可调整大小的图像。
答案 1 :(得分:1)
设置影响对象布局的属性时,将在内部调用setNeedsDisplay
。您需要自己调用自定义属性等,不会自动调用它。
答案 2 :(得分:1)
setNeedsDisplay仅适用于图层或视图的内容。即,如果视图的内容已更改并需要重新绘制,则可以使用setNeedsDisplay告诉视图需要重绘并触发其drawRect方法。
视图上的变换(例如位置,比例和旋转等)由GPU直接处理,不需要重绘视图;因此,当您只是移动或转换视图时,setNeedsDisplay不适用。