3

我已經使用iOS 8.1設置了一個非常簡單的單視圖應用程序(在Swift中)。我已經將一個UIImageView添加到主視圖控制器視圖。我正在嘗試使用CAKeyframeAnimation爲一系列圖像製作動畫。我最初使用的UIImageView animationImages屬性工作正常,但我需要能夠精確知道何時動畫完成,因此移動到CAKeyframeAnimation。Swift CAKeyframe動畫不顯示圖像

我的代碼如下:

class ViewController: UIViewController { 


@IBOutlet weak var imageView: UIImageView! 
var animation : CAKeyframeAnimation! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    let animationImages:[AnyObject] = [UIImage(named: "image-1")!, UIImage(named: "image-2")!, UIImage(named: "image-3")!, UIImage(named: "image-4")!] 

    animation = CAKeyframeAnimation(keyPath: "contents") 
    animation.calculationMode = kCAAnimationDiscrete 
    animation.duration = 25 
    animation.values = animationImages 
    animation.repeatCount = 25 
    animation.removedOnCompletion = false 
    animation.fillMode = kCAFillModeForwards 
    self.imageView.layer.addAnimation(animation, forKey: "contents") 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

} 

的問題是,動畫不顯示任何圖像,我只是得到一個空白屏幕。在上面的代碼中是否有我缺少的東西?我怎樣才能讓動畫顯示?

+0

這不完全是答案,但要注意在'viewDidLoad'中做一個動畫是沒有意義的。當時發生的所有事情都是視圖加載到視圖控制器中。該視圖尚未在界面中顯示。 'viewDidLoad'沒有什麼可看的。 – matt

+0

感謝馬特的糾正。在我最初的代碼庫中,我確實從viewDidAppear調用了它,但在將簡單的測試項目放在一起時,我不幸沒有考慮放置它的正確位置。 – prajna

+0

沒問題 - 只要確保你意識到不同。你之前是! – matt

回答

6

此行是從來沒有去上班:

animation.values = animationImages 

將其更改爲:

animation.values = animationImages.map {$0.CGImage as AnyObject} 

的原因是,你正試圖動畫這層"contents"關鍵。但這是contents財產。但contents屬性必須設置爲CGImage,而不是UIImage。相反,您的animationImages包含UIImages,而不是CGImages。因此你需要將你的UIImage數組轉換成CGImage數組。此外,你試圖將這個數組傳遞給Objective-C,其中一個NSArray只能包含對象;由於CGImage不是Objective-C的一個對象,所以你需要將它們當作AnyObject。這就是我的map調用。

+0

有關這種「精靈」圖像動畫的工作示例,請參閱我的書中的以下代碼:https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch04p149keyframeSprite/ch17p495keyframeSprite/ViewController。 swift – matt

+0

謝謝Matt。明智的回答和感謝您的書鏈接,它將在未來派上用場。 – prajna

+0

非常感謝您澄清拼圖的CGImage部分。我花了數小時試圖解決這個問題。 +1 –