1

我正在使用它来移动我的图像:

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

4

3 回答 3

3

我假设imgImageViewUIImageView. 如果它不是的实例UIImageView,请编辑您的问题以告诉我们它是什么。

更改center视图的属性永远不需要您的应用重绘视图。backboardd显示服务器(在 iOS 6 和更早版本中是一个单独的进程springboard)已经拥有视图像素数据的副本。当您更改视图的center时,视图只是通知显示服务器它的新位置,并且显示服务器将视图的像素数据复制到屏幕的适当部分。

因此,更改center视图的属性永远不需要您发送setNeedsDisplay.

更具体地说,UIImageView甚至没有实现drawRect:. 相反,UIImageView只需在设置其图像时将其图像的像素数据发送到显示服务器。因此,即使您发送setNeedsDisplay到 a UIImageView,它仍然不会运行任何drawRect:方法。

顺便说一句,您也可以在自己的UIView子类中执行此操作,方法是设置self.layer.contents为 aCGImageRef而不是实现drawRect:. 您将需#import <QuartzCore/QuartzCore.h>要这样做。当然,还有UIImageView其他事情,比如处理动画和可调整大小的图像。

于 2013-04-02T03:01:30.667 回答
1

当您设置影响对象布局的属性时,setNeedsDisplay将在内部调用。对于不会自动调用它的自定义属性等,您需要自己调用它。

于 2013-04-02T02:40:51.890 回答
1

setNeedsDisplay 仅适用于图层或视图的内容。即,如果视图的内容已更改并且需要重绘,您将使用 setNeedsDisplay 告诉视图它需要重绘并触发它的 drawRect 方法。

视图上的变换,例如位置、缩放和旋转等,由 GPU 直接处理,不需要重新绘制视图;因此,当您只是移动或转换视图时,setNeedsDisplay 不适用。

于 2013-04-02T03:04:52.680 回答