在watchOS上保存并加载核心图形UIImage阵列

时间:2016-08-01 15:03:46

标签: swift uiimage watchkit wkinterfacegroup watch-os-3

我希望能够使用watchOS保存在Apple Watch上创建的UIImage数组,并将这一系列图像作为动画播放作为组背景。我可以制作图像阵列并播放它,但我无法弄清楚如何存储/保存这些图像,以便我可以在下次运行应用程序时检索/加载它们,这样我就不必在每次应用程序时都构建它们运行。

以下是我使用Core Graphics(Swift 3)构建图像的示例:

import WatchKit
import Foundation


class InterfaceController: WKInterfaceController
{
    @IBOutlet var colourGroup: WKInterfaceGroup!

    override func awake(withContext context: AnyObject?)
    {
        super.awake(withContext: context)

    }

    override func willActivate()
    {
        var imageArray: [UIImage] = []
        for imageNumber in 1...250
        {
            let newImage: UIImage = drawImage(fade: CGFloat(imageNumber)/250.0)
            imageArray.append(newImage)
        }

        let animatedImages = UIImage.animatedImage(with:imageArray, duration: 10)

        colourGroup.setBackgroundImage(animatedImages)
        let imageRange: NSRange = NSRange(location: 0, length: 200)
        colourGroup.startAnimatingWithImages(in: imageRange, duration: 10, repeatCount: 0)

        super.willActivate()
    }

    func drawImage(fade: CGFloat) -> UIImage
    {
        let boxColour: UIColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: fade)

        let opaque: Bool = false
        let scale: CGFloat = 0.0

        let bounds: CGRect = WKInterfaceDevice.current().screenBounds

        let imageSize: CGSize = CGSize(width: bounds.width, height: 20.0)


        UIGraphicsBeginImageContextWithOptions(imageSize, opaque, scale)

        let radius: CGFloat = imageSize.height/2.0

        let rect: CGRect = CGRect(x: 0.0, y: 0.0, width: imageSize.width, height: imageSize.height)

        let selectorBox: UIBezierPath = UIBezierPath(roundedRect: rect, cornerRadius: radius)

        let boxLineWidth: Double = 0.0
        selectorBox.lineWidth = CGFloat(boxLineWidth)
        boxColour.setFill()
        selectorBox.fill()

        // return the image
        let result: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return result

    }

    override func didDeactivate()
    {
        // This method is called when watch view controller is no longer visible
        super.didDeactivate()
    }

}

基本上我正在寻找一种方法来保存和加载[UIImage]的方式,我可以使用UIImage.animatedImage(带有:[UIImage],持续时间:TimeInterval)和数组

有没有办法保存图像数组,以便下次运行应用程序时加载它而不是重建图像?

由于

格雷格

1 个答案:

答案 0 :(得分:1)

NSKeyedArchiver和NSKeyedUnarchiver做了这个伎俩。这是XCode 8b4的Swift代码:

override func willActivate()
{
    var imageArray: [UIImage] = []

    let fileName: String = "TheRings"
    let fileManager = FileManager.default
    let url = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first! as NSURL
    let theURL: URL = url.appendingPathComponent(fileName)!


    if let rings = NSKeyedUnarchiver.unarchiveObject(withFile: theURL.path) as? [UIImage]
    {
        print("retrieving rings - found rings")
        imageArray = rings
    }
    else
    {
        print("retrieving rings - can't find rings, building new ones")

        for imageNumber in 1...250
        {
            let newImage: UIImage = drawImage(fade: CGFloat(imageNumber)/250.0)
            imageArray.append(newImage)
        }
         NSKeyedArchiver.archiveRootObject(imageArray, toFile: theURL.path)
    }

    let animatedImages = UIImage.animatedImage(with:imageArray, duration: 10)

    colourGroup.setBackgroundImage(animatedImages)
    let imageRange: NSRange = NSRange(location: 0, length: 200)
    colourGroup.startAnimatingWithImages(in: imageRange, duration: 10, repeatCount: 0)

    super.willActivate()
}