我用这个来移动我的图像:
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的意义是什么?
发布于 2013-04-02 11:01:31
我假设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还可以做其他事情,比如处理动画和可调整大小的图像。
发布于 2013-04-02 10:40:52
当您设置影响对象布局的属性时,将在内部调用setNeedsDisplay。你需要自己调用它的自定义属性,等等,不会自动调用它。
发布于 2013-04-02 11:04:53
setNeedsDisplay仅适用于图层或视图的内容。也就是说,如果视图的内容发生了变化,需要重新绘制,您可以使用setNeedsDisplay来告诉视图需要重新绘制,这将触发它的drawRect方法。
视图上的变换,如位置、缩放和旋转等,都是由图形处理器直接处理的,不需要重新绘制视图;因此,当您只是移动或变换视图时,setNeedsDisplay不适用。
https://stackoverflow.com/questions/15755097
复制相似问题