2017-06-06 17 views
0

基本的には、UICollectionViewCellのサブビューであるimageViewに単純な回転アニメーションを追加するだけで、アニメーションはうまくいきますが、コレクションビューをスクロールしてスクロールすると、アニメーションは停止しました。この問題を解決するには? これがimageViewに追加したものです。アニメーションをUICollectionViewで処理する方法

let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation") 
rotationAnimation.fromValue = 0.0 
rotationAnimation.toValue = Double.pi 
rotationAnimation.duration = 2.0 
rotationAnimation.repeatCount = .infinity 
view.layer.add(rotationAnimation, forKey: nil) 
+0

を役に立てば幸い?あなたのコードはより多くのコンテキストを必要とします。 – jrturton

+0

func collectionView(_ collectionView:UICollectionView、cellForItemAt indexPath:IndexPath) - > UICollectionViewCellに追加します。 – Xie

答えて

1

はそれを行うことができますCADisplayLinkでアニメーションを作り、実行ループとそのcommonModesを使用する必要があり、スクロールの影響を避けるために:

self.displayLinkForRotation.isPaused = false 

はそれを破壊する:

private var _displayLinkForRotation:CADisplayLink? 
var displayLinkForRotation:CADisplayLink { 
    get{ 
     if _displayLinkForRotation == nil { 
      _displayLinkForRotation = CADisplayLink(target: self, selector: #selector(excuteAnimations)) 
      _displayLinkForRotation?.add(to: RunLoop.current, forMode: RunLoopMode.commonModes) 
     } 
     return _displayLinkForRotation! 
    } 
} 

func excuteAnimations() { 
    //This function will be called 60 times per second. 
    //According to your question, you have 2 seconds to rotate the view to 180 angle. So we rotate 90 angle per second here. 
    //self.view could be replaced by another view you want to rotate. 
    self.view.transform = self.view.transform.rotated(by: 90.0/60.0/180.0 * CGFloat.pi) 

    let angle = atan2(self.view.transform.b, self.view.transform.a) * (45.0/atan(1.0)) 
    if (round(angle) >= 180.0) { //Stop when rotated 180 angle 
     self.displayLinkForRotation.isPaused = true 
    } 
} 

は、アニメーションを開始するには:

self.displayLinkForRotation.invalidate() 
_displayLinkForRotation = nil 
+0

お返事ありがとうございます!私はexcuteAnimations(ビュー:UIView)をfuncするための関数を変更していますが、 "キャッチされない例外 'NSInvalidArgumentException'の理由でアプリケーションを終了するとエラーが発生しました。 [CADisplayLink transform]:インスタンスに送信された認識できないセレクタ0x1742028c0 '" – Xie

+0

ビューを渡すパラメータを使用しないで、代わりにグローバルなimageView変数を使用します。このパラメータは、CADisplayLink自体を関数に渡します。 –

+0

コレクションビューの一部の画像ビューにアニメーションを追加したいのですが、ここでグローバル変数を使用できないようですね。 – Xie

0

あなたは

view.layer.add(rotationAnimation, forKey: "transform.rotation") 

にrotationAnimation 変更ライン

view.layer.add(rotationAnimation, forKey: nil) 

を初期化するときに使用したアニメーションのキーを、追加していないので、あなたがこのアニメーションを追加する場合、それは

関連する問題