【问题标题】: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 调用完成的?

【问题讨论】:

    标签: iphone objective-c ios4 uiimageview


    【解决方案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 将不会处理疯狂的大文件本身,而是一个适当缩放的版本,当它需要动画时。
    猜你喜欢
    • 2012-02-26
    • 2021-09-16
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 2011-11-12
    • 2013-07-23
    • 2013-11-14
    • 2014-06-30
    相关资源
    最近更新 更多