setNeedsDisplay混乱

时间:2013-04-02 02:31:25

标签: ios

我用它来移动我的形象:

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

3 个答案:

答案 0 :(得分:3)

我认为imgImageViewUIImageView的一个实例。如果不是 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不适用。