我使用应用程序组来存储用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文件夹存储动画帧,因为它们是由应用程序动态生成的。
有人知道如何解决这个问题吗?
答案 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的主线程。希望这实际上不会发生在设备的主线程上。