首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >setNeedsDisplay混淆

setNeedsDisplay混淆
EN

Stack Overflow用户
提问于 2013-04-02 10:31:25
回答 3查看 809关注 0票数 1

我用这个来移动我的图像:

代码语言:javascript
复制
meteorDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(moveImage:)];

下面是我的moveImage:方法:

代码语言:javascript
复制
-(void) moveImage:(CADisplayLink *)sender{
    CGPoint img;
    imgLocation = imgImageView.center;
    if (img < 100) {
        img.y++;
    }
    else{
         imgLocation.y = 0;
    }
    imgImageView.center = imgLocation;    
}

这将更新我的图像在屏幕上的位置。为什么setNeedsDisplay在这里没有效果?setNeedsDisplay的意义是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-02 11:01:31

我假设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还可以做其他事情,比如处理动画和可调整大小的图像。

票数 3
EN

Stack Overflow用户

发布于 2013-04-02 10:40:52

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

票数 1
EN

Stack Overflow用户

发布于 2013-04-02 11:04:53

setNeedsDisplay仅适用于图层或视图的内容。也就是说,如果视图的内容发生了变化,需要重新绘制,您可以使用setNeedsDisplay来告诉视图需要重新绘制,这将触发它的drawRect方法。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15755097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档