为啥我的 ImageView 没有做任何事情,至少没有重绘?
Posted
技术标签:
【中文标题】为啥我的 ImageView 没有做任何事情,至少没有重绘?【英文标题】:Why isn't my ImageView doing anything, at least redrawing?为什么我的 ImageView 没有做任何事情,至少没有重绘? 【发布时间】:2013-06-19 20:25:02 【问题描述】:我做了一个函数,它将循环显示图像(1.png、2.png、3.png、4.png、5.png)并将它们显示到 UIImageView。这个想法是我正在加载一个网页,我希望这个 imageview 能够通过这个函数运行,基本上作为一个加载图标。但是我不明白为什么它不起作用,就 imageview 而言,我什么也没看到。请帮忙!我的函数代码如下。我知道我在这里做错了,因为我测试的所有其他东西,包括 webview 委托都可以正常工作。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
for(int c = 1; !webviewLoaded; c++)
c = c % 6;
if(c == 6)
c = 1;
NSString *numberString = [NSString stringWithFormat:@"%d.png", c];
UIImage *img = [UIImage imageNamed:numberString];
[self.loadingImage setImage:img];
sleep(1);
);
【问题讨论】:
你应该阅读关于 UIImageView 的文档。它内置了动画。 【参考方案1】:因为您在后台线程上执行 UI 操作,所以您不应该从后台线程更改 UI 组件。
您可以按如下方式更改您的代码:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
dispatch_async(dispatch_get_main_queue(), ^
for(int c = 1; !webviewLoaded; c++)
c = c % 6;
if(c == 6)
c = 1;
NSString *numberString = [NSString stringWithFormat:@"%d.png", c];
UIImage *img = [UIImage imageNamed:numberString];
[self.loadingImage setImage:img];
sleep(1);
);
这段代码可以工作,但有点没用,它会给你带来不如你预期的结果,因为你正在做的是创建一个单独的线程(操作)只是为了从中调用 UI 线程而且效率不高。
你应该做的是像这样完全删除调度:
for(int c = 1; !webviewLoaded; c++)
c = c % 6;
if(c == 6)
c = 1;
NSString *numberString = [NSString stringWithFormat:@"%d.png", c];
UIImage *img = [UIImage imageNamed:numberString];
[self.loadingImage setImage:img];
sleep(1);
这也可以,但请确保您已将这些文件 @"%d.png
添加到您的项目中。
因为你不熟悉GCD
,这里是good tutorial
【讨论】:
@MarcusAdams 是的,他可以,但他发布了一段代码,我不知道他是如何使用它的,所以我发布了该代码的解决方案,但我认为他正在尝试要做(只需从项目中加载一些图像)不需要任何类型的dispatch
,因为没有对图像或其他计算进行繁重的处理,这就是我添加第二段代码的原因;)
感谢您的帮助和资源。仅供参考,您的建议只是部分解决方案。为了使其正常工作,您只需要将第二个块放在正在更改的 UI 周围,因为我仍然感谢您抽出时间以上是关于为啥我的 ImageView 没有做任何事情,至少没有重绘?的主要内容,如果未能解决你的问题,请参考以下文章