2017-02-07 6 views
0

私は3秒または4秒間実行したいパルスアニメーションを持っていて、そのアニメーションを遅延させて実行してから次の画面に切り替える方法を探しています。私は遅延のために、以下のコードを使用していますが、私は関数を呼び出すときに動作していません。即時に遅れてアニメーションを実行する

NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(3), target: self, selector: "functionHere", userInfo: nil, repeats: false) 

ご意見がありましたら教えてください。

let pulseAnimation = CABasicAnimation(keyPath: "opacity") 
    pulseAnimation.duration = 1 
    pulseAnimation.fromValue = 0 
    pulseAnimation.toValue = 1 
    pulseAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 
    pulseAnimation.autoreverses = true 
    pulseAnimation.repeatCount = FLT_MAX 
    XboxOneL.layer.addAnimation(pulseAnimation, forKey: "animateOpacity") 
    XboxOneR.layer.addAnimation(pulseAnimation, forKey: "animateOpacity") 
+0

[prepareForSegue'と遅延で[ビューがアニメーション化されているかどうかをチェック](http://stackoverflow.com/questions/5526476/how-to-tell-if-uiview-is-in-middle-of-animation)それに応じて。 – brandonscript

+0

あなたのアニメーションコードを投稿してください。どのようなアニメーションをやっていますか?それらのほとんどはアニメーションが終了した後であなたのセグを実行するのに使うことができる補完機能を設定する方法を持っています。 – creeperspeak

+0

あなたはそれが何かのようになりたいですか?ユーザーがボタンを押したとき(または他の何らかのアクション)、xの遅延があり、アニメーションが3〜4秒かかると、最後にセグが別の画面に表示されますか? – theMikeSwan

答えて

1

UIView.animate(withDuration :)の完了ハンドラを使用します。以下の基本サンプル:

func performMyAnimation() { 
    UIView.animate(withDuration: {$duration}, 
     animations: { /* Animation Here */ }, 
     completion: { _ in self.performSegue(withIdentifier: "segueIdentifierHere", sender: nil) } 
} 

アニメーションはanimationsブロックで実行されます。完了すると、次の画面にセグを実行します。


編集:質問は今CABasicAnimationを使用して、アニメーションのコードが含まれてとして、おそらくthis answer CAAnimationコールバックのためのあなたのために働くことがあります。

基本的には、CABasicAnimationコールをCATransactionとラップする必要があります。あなたはスウィフト3に標準で遅延を探しているなら

CATransaction.begin() 
CATransaction.setCompletionBlock({ 
    self.performSegue(withIdentifier: "segueIdentifierHere", sender: nil) 
}) 
// Your animation here 
CATransaction.commit() 
+0

これは理にかなっていますが、実装してもまだアニメーションがなく、自動的にはじまるだけです。 – dgelinas21

+0

@ dgelinas21私は 'CABasicAnimation'の使い方に関する情報を得たので、私の答えを更新しました。うまくいけば助けてくれます。 –

2

、それはUIView.animate(withDuration:_:)と一緒にDispatchQueueのAPIを使用するのが最善です。

たとえば、あなたが3秒で1.0秒のアニメーションを遅らせたい場合:

let yourDelay = 3 
let yourDuration = 1.0 
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .seconds(yourDelay), execute: {() -> Void in 
    UIView.animate(withDuration: yourDuration, animations: {() -> Void in 
     // your animation logic here 
    }) 
}) 

これはあなたのアニメーションが実装されている方法に応じて、あなた

+0

これは理にかなっていますが、残念ながら私はこれにswift 3.0を使用していません。 – dgelinas21

+0

あなたはどのバージョンを使用していますか? @ dgelinas21 –

+0

私は速いバージョン2.2を実行しています – dgelinas21

2

に理にかなって、あなたが使用することができれば、私に教えてください:アニメーションを実行する前に、

UIView.animate(withDuration: 0.3, delay: 5.0, options: [], animations: { 
//Animations 
}) { (finished) in 
//Perform segue 
} 

これは、(あなたがあなたのセグエを実行)完了ブロックを実行し、遅延を適用します。

EDIT:CAAnimationsを使用するように質問が更新されました。このソリューションはうまくいかないと思います。

関連する問題