UIImageView 是不是具有指示 setImage 已完成且动画已准备好的属性?

Posted

技术标签:

【中文标题】UIImageView 是不是具有指示 setImage 已完成且动画已准备好的属性?【英文标题】:Does UIImageView have a property to indicate setImage has completed and animations are ready?UIImageView 是否具有指示 setImage 已完成且动画已准备好的属性? 【发布时间】:2011-05-10 21:11:22 【问题描述】:

刚刚开始使用 Obj-C 和 ios 编程。我有一些代码可以将 imageView 加载到(HIDDEN:YES)UIView 中 - 很简单

[bgImageView setImage:[UIImage imageNamed:@"Filename.jpg"];

然后代码在 fgImageView 和 bgImageView 上设置和提交动画。 因为一些图像可能很大,有时来自新 bgImage 的动画不会使用其中的新背景图像进行渲染,而是“停止并显示”。请注意,在 setImage 期间不会发生停顿。它发生在代码后面的第二个动画提交期间。因为 animationCommit 会强制应用程序等到这个 ImageView 的动画完成。

我正在寻找的是 UIImageView 上的“setImage commit”,

我宁愿在图像加载之前显示一个微调器,然后继续动画,但是 UIImageView 类似乎没有 isLoaded 属性。

有没有一种简单的方法来确定 UIImageView 是通过 setImage 调用完成的?

【问题讨论】:

【参考方案1】:

我的直觉是 setImage 是同步处理的,特别是因为您正在谈论应用程序如何停止。您可能希望在 NSOperation 中运行 setImage 以允许在后台发生这种情况。

http://developer.apple.com/library/ios/#documentation/cocoa/reference/NSOperation_class/Reference/Reference.html

NSInvocationOperation *myOp = [[NSInvocationOperation alloc] initWithTarget:myImageView selector@selector(setImage:) object:aUIImage];
[myOp addObserver:(NSObject *)self forKeyPath:(NSString *) @"isFinished" options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:NULL];
[anOpQueue addOperation:myOp];

然后,您将处理 KVO 操作并在那里移除微调器。

【讨论】:

应用程序没有停止——bgimage 上的animationcommit 确实停止了——但是setimage 和animationcommit 之间的代码运行(例如,fgimage 动画完成然后停止,这是7 行代码之后)跨度> 事实上,如果它停止,那会更好 - setImage 似乎正在后台线程中加载和缩放图像。我正在尝试确定后台线程已完成并且 uiimageview 已准备好动画。 更重要的是 - 它似乎 setImage 同步加载,但 UIImageView 异步缩放图像......这就是症结所在,我相信。【参考方案2】:

[UIImageView setImage:] 不是异步的:它在消息返回之前立即完成。如果视图没有立即显示图像,可能是因为一些懒惰的 UIImage 代码。我的猜测是[UIImage imageNamed:] 只是引用包中的文件,并且仅在请求图像数据后才加载它。

您可以尝试通过向其发送 CGImage 消息来强制加载图像:

[bgImageView.image CGImage];

如果这仍然没有触发要加载的图像,则必须在某处绘制它:

UIGraphicsBeginImageContext((CGSize)1, 1);
[bgImageView drawInRect:(CGRect)0, 0, 1, 1];
UIGraphicsEndImageContext();

【讨论】:

bgImageView 不会响应 drawInRect,但 bgImageView.image 会。不幸的是,这两个代码块似乎都没有强制同步等待图像真正准备好/缩放/加载。 虽然图像可能已加载 - 它可能尚未完成缩放 - 图像大小为 1.5MB。【参考方案3】:

UIImageView - (BOOL)isAnimating 中有一个方法,所以你可以使用:

if (![bgImageView isAnimating]) 
    // continue to next image;

这是否足够,或者是否有其他动画正在进行中会给出错误响应?

【讨论】:

我已经尝试过了,但无济于事 - isAnimating 显然无法识别 uiimageview 仍在忙于在后台缩放图像。 很遗憾听到这个消息。这有点混乱,但可以用- (void)setImage:(UIImage *)image [super setImage:image]; // your custom code; 覆盖setImage: 方法。更糟的是,您可以在其中包含一个通知以发送到主线程,让它知道它可以继续到下一张图像 如果我有办法知道图像何时完成缩放/加载,我确实可以做到这一点 - 但这个问题仍然存在。感谢您的帮助 - 但 //your custom code block 仍然是问题 - 我怎么知道图像确实准备好制作动画了? 在用几乎所有可能的搜索字段为您寻找解决方案后,我找不到答案来确定图像何时确实已缩放和加载。但是,我确实找到了一个链接,如果这适合您的情况,它可能会很有用,here。基本上它说 UIImageView 并不意味着保存大图像并提供调整它们大小以避免问题的方法(不破坏原始图像的质量)。不过,如果不是这样,我会继续环顾四周 感谢您的努力,slev - 我会牢记这个建议,而不是直接在视图中使用 UIImage imageNamed,我将根据 [link] (vocaro.com/trevor/blog/2009/10/12/…) 调整图像大小你的帖子在这里引用。这样 UIImageView 将不会处理疯狂的大文件本身,而是一个适当缩放的版本,当它需要动画时。

以上是关于UIImageView 是不是具有指示 setImage 已完成且动画已准备好的属性?的主要内容,如果未能解决你的问题,请参考以下文章

具有多个缩放级别的 UIScrollView?

活动指示器未显示在视图前面

为什么UIImageview不是完美的圆圈?

具有异步 UIImageView 的自动布局 UITableViewCell 不起作用

如何用红色绘制 UIImageView 框架

UIScrollView 中的 UIImageView 和 UIWebView