2017-03-27 3 views
0

のcontentsプロパティを使用してUIImageViewに配置したマスクをアニメートしたいと思います。残念ながら、現在の実装 は、トランジション間を通過することなく、配列の最初と最後のイメージの間でのみアニメーション表示されるようです。これを達成する方法はありますか?またはCAReplicatorLayerのような他のものを見なければなりませんか?ここでUIImagesの配列を使用してCALayerのcontentsプロパティをアニメーション化するにはどうすればよいですか?

は、私が現在持っているものです。

 let mask = CALayer() 
     mask.frame = self.frame 
     self.layer.mask = mask 
     mask.contents = transitions.first?.cgImage 

     let maskAnimation = CABasicAnimation(keyPath: "contents") 
     maskAnimation.fromValue = transitions.first?.cgImage 
     maskAnimation.toValue = transitions.last?.cgImage 
     maskAnimation.duration = duration 
     mask.contents = transitions.last 
     mask.add(maskAnimation, forKey: "ContentsAnimation") 

答えて

1

アニメーションシステムは、魔法、それは最初と最後の画像の間を補間するために何を意味するのか知りません。明示的にそれを伝えなければなりません。それはまさにキーフレームアニメーションのためのものです。ここで

は私のプロジェクトから、そのようなアニメーションを形成する例を示します

let anim = CAKeyframeAnimation(keyPath:#keyPath(CALayer.contents)) 
    anim.values = self.images.map {$0.cgImage!} 
    anim.keyTimes = [0.0, 0.25, 0.5, 0.75, 1.0] 
    anim.calculationMode = kCAAnimationDiscrete 
    anim.duration = 1.5 

あなたが見ることができるように、我々は画像の配列を持っています。彼らはUIImagesなので、私は彼らのCGImageバッキングを引き出す必要があります(私はあなたのtransitionsが似ていると仮定します)。 keyTimesアレイは、durationをフレームに分割するために使用されます。私は私のアニメーションの性質のために少し奇妙なことにこの部門をやっているので、時間を分けるために時間を固定してください均等に

+0

実際のプロジェクトは、ダウンロード可能で、実行可能です:https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch04p149keyframeSprite/ch17p495keyframeSprite/ViewController.swift – matt

+0

これは完璧でした。ありがとうございました! – cyril

関連する問題