WatchKit:存储在App Group中的动画图像

时间:2015-03-14 18:21:55

标签: ios iphone swift animation watchkit

我使用应用程序组来存储用NSData创建的UIImageJPEGRepresentation()个JPEG图像。现在我想将该数组中包含的图像数据用作WKInterfaceImage实例的动画帧。

我已使用NSData成功归档了我的应用程序组中的NSKeyedUnarchiver JPEG图像,现在我正在缓存传送动画所需的图像。

    var frames = ...
    for (index, frame) in enumerate(frames) {
        WKInterfaceDevice().addCachedImageWithData(frame, name: "frame" + String(index))
    }

    animationImage.setImageNamed("frame")
    animationImage.startAnimating()

不幸的是,这段代码似乎不起作用;当我打开相应的WKInterfaceController时,我只看到加载屏幕2/3分钟而不是"无法找到名为&#34的图像;框架"在观看 "控制台上的消息。我不能使用Images.xcassets文件夹存储动画帧,因为它们是由应用程序动态生成的。

有人知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

让它工作的诀窍是将所有UIImages组合成一个UIImage对象并将其发送到设备。见下文。

import WatchKit
import Foundation

class InterfaceController: WKInterfaceController {
    @IBOutlet weak var imageView: WKInterfaceImage!

    override func awakeWithContext(context: AnyObject?) {
        super.awakeWithContext(context)

        var imageArray : NSMutableArray = [];
        for ( var index = 0; index < 10; ++index ) {
            var imageName = "frame" + String(index) 
            var image = UIImage(named:imageName);
            if ( image != nil ) {
                imageArray.addObject(image!)
            }
        }
        var combinedImage = UIImage.animatedImageWithImages(imageArray, duration:1); 
        WKInterfaceDevice().addCachedImage(combinedImage, name: "frame");
    }

    override func willActivate() {
        super.willActivate()
        self.imageView.setImageNamed("frame")
        self.imageView.startAnimating()
    }

    override func didDeactivate() {
        super.didDeactivate()
        self.imageView.stopAnimating()
    }
}

答案 1 :(得分:1)

这绝对有效,您的方法也很合理。问题是,在将缓存的图像传输到Watch之前,您无法实际加载缓存的图像。这有点棘手。简而言之,您需要将这些动态图像推送到Watch方式,然后才需要将它们添加到要显示的界面元素中。

这可以简单地演示如下代码:

let data = NSData() // obviously make this an image
WKInterfaceDevice().addCachedImageWithData(data, name: "example_image")

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(4.0 * Float(NSEC_PER_SEC))), dispatch_get_main_queue()) { [weak self] in
    if let strongSelf = self {
        strongSelf.animationImage.setImageNamed("example_image")
    }
}
  

四秒可能没有足够的时间来传输图像。你必须玩这个价值。

iOS模拟器的转移行为非常奇怪。当传输正在进行时,它会阻止Watch App的主线程。希望这实际上不会发生在设备的主线程上。