7

CollectionView があり、ユーザーが選択した CollectionViewCell 内にアニメーションを作成したいと考えています。カスタム アニメーションを段階的に作成したいので、animateKeyframesWithDuration を使用することにしました。私のコードは次のようになります。

func animate() {
    UIView.animateKeyframesWithDuration(1.0, delay: 0.0, options: .AllowUserInteraction, animations: { () -> Void in
        UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 0.5, animations: { () -> Void in
            //  First step
        })
        UIView.addKeyframeWithRelativeStartTime(0.5, relativeDuration: 0.5, animations: { () -> Void in
            //  Second step
        })
        }) { (finished: Bool) -> Void in
            if self.shouldStopAnimating {
                self.loadingView.layer.removeAllAnimations()
            } else {
                self.animate()
            }
        }
}

これは、選択されたときにカスタム CollectionViewCell 内で実行されます。問題は、特定の時点ですぐにアニメーションを強制的に停止したいということです。しかし、私がそうすると、アニメーションは完全に停止せず、残りのアニメーションを別のセル (おそらく最後に再利用されたセル?) に移動するだけです。

なぜこれが起こっているのか理解できません。さまざまなアプローチを試しましたが、通常完了ブロックに入る前にアニメーションを正常に停止する方法はありません

誰かこれについて何か考えがありますか?

4

1 に答える 1

0

レイヤーからアニメーションを削除する代わりに、アニメーションを停止したいビュー プロパティを設定する非常に短い期間の別のアニメーションを追加してみてください。

このようなもの:

if self.shouldStopAnimating {
    UIView.animate(withDuration: 0.01, delay: 0.0, options: UIView.AnimationOptions.beginFromCurrentState, animations: { () -> Void in
        //set any relevant properties on self.loadingView or anything else you're animating
        //you can either set them to the final animation values
        //or set them as they currently are to cancel the animation
    }) { (completed) -> Void in
    }
}

この回答も役立つ場合があります。

于 2016-03-23T23:42:34.600 に答える