2016-04-29 18 views
0

を私はサークルの進捗タイマーを表し小型のUIViewを持って、私はhttps://github.com/kaandedeoglu/KDCircularProgress- KDCircularProgress円形バー

から引き出されたいくつかのコードを修正しています。私はそれを参照して、またそれをKDCircularProgressクラスにインスタンス化しました。

私はタイマープログレス円形バーを開始し、リセットするためのメソッドを実装するために管理しています。

しかし、私はを再起動しています。ポーズアニメーションを再生すると、循環進行バーがになります。

マイコードプリアンブル:

import UIKit 

class SomeTableViewController: UITableViewController { 

//Circular progress vars 
var currentCount = 1.0 
let maxCount = 60.0 

//Reference selected UIView & instantiate 
@IBOutlet weak var circularProgressView: KDCircularProgress! 

スタートアニメーション - 60秒のアニメーション:

if currentCount != maxCount { 
    currentCount += 1 
    circularProgressView.animateToAngle(360, duration: 60, completion: nil) 
    } 

アニメーションを停止し、リセットするには

currentCount = 0 
circularProgressView.animateFromAngle(circularProgressView.angle, toAngle: 0, duration: 0.5, completion: nil) 

アニメーションを一時停止する:

circularProgressView.pauseAnimation() 

は、どのように私は一時停止状態の後にアニメーションを再起動する方法を設定するのでしょうか?任意の明確化のため、事前に

感謝します。これは私の最初のアニメーションですが、私はこの問題を自分で解決しようとしましたが、私の特定のケースに適用できる構文を見つけられないようです。正しい道に私を置くための@Duncan Cに

ありがとう:

は解決策を更新しました。

次のように私は私がcurrentCount += 1を使用してカウンタの進捗を開始したので、私は私がカウンターを一時停止しようとするだろうと思った...

を私の問題を解決しました:

私は 'を持っているだろうと思った
if currentCount != maxCount { 
currentCount -= 1 
circularProgressView.animateToAngle(360, duration: 60, completion: nil) 
} 

カウンター(net off off counter +=1counter -=1)を効果的に停止させることができます。理論的には、これはカウンターのゼロへの進展であるはずですが、それはカウントダウンを続けました。

だから私は、円形のカウンターのアニメーションを一時停止するcircularProgressView.pauseAnimation()に戻って戻りました。

一時停止後にアニメーションを再開するには、の更新時間を、更新時間、つまりアニメーションが一時停止した時間に変更する必要がありました。

私はここでのトリックのビットを使用してNSTimer含ま - 私はとにかく自分のコードを持っているために起こりました。一時停止の時にアニメーションを再起動する

if currentCount != maxCount { 
     currentCount += 1 

     circularProgressView.animateToAngle(360, duration: NSTimeInterval(swiftCounter), completion: nil) 
    } 

私はアニメーションの円形バーのための私の期間を更新する方法を見つけ出すことができませんでしたが、NSTimerを使用して経過時間を更新する方法を知っていました - タイマーは同じ持続時間とカウントダウン速度で動作します。そこで私は、更新されたタイマーの値への参照にタグを付けました。解決した問題;)

マイコード:

import UIKit 

class SomeFunkyTableViewController: UITableViewController { 

//Circular progress variables 
var currentCount = 0.0 
let maxCount = 60.0 

@IBOutlet weak var circularProgressView: KDCircularProgress! 


//Timer countdown vars 
var swiftTimer = NSTimer() 
var swiftCounter = 60 



@IBOutlet weak var startButton: UIButton! 
@IBOutlet weak var timerView: UIView! 

@IBOutlet weak var timerLabel: UILabel! 

@IBOutlet weak var startView: UIView! 

override func viewDidLoad() { 

    circularProgressView.angle = 0 

    timerLabel.text = String(swiftCounter) 


     super.viewDidLoad() 


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


@IBAction func startButton(sender: AnyObject) { 


    pauseBtn.alpha = 1.0 

    playBtn.alpha = 1.0 

    stopBtn.alpha = 1.0 

    circularProgressView.hidden = false 


    if currentCount != maxCount { 
     currentCount += 1 

     circularProgressView.animateToAngle(360, duration: 60, completion: nil) 
    } 

    startView.hidden = true 
    timerView.hidden = false 


    swiftTimer = NSTimer.scheduledTimerWithTimeInterval(1, target:self, selector: #selector(SomeFunkyTableViewController.updateCounter), userInfo: nil, repeats: true) 



} 


@IBOutlet weak var pauseBtn: UIButton! 
@IBAction func pauseButton(sender: AnyObject) { 

    circularProgressView.pauseAnimation() 



    swiftTimer.invalidate() 

    pauseBtn.alpha = 0.5 

    playBtn.alpha = 1.0 

    stopBtn.alpha = 1.0 
} 


@IBOutlet weak var playBtn: UIButton! 
@IBAction func playButton(sender: AnyObject) { 




    if currentCount != maxCount { 
     currentCount += 1 

     circularProgressView.animateToAngle(360, duration: NSTimeInterval(swiftCounter), completion: nil) 
    } 




    if !swiftTimer.valid { 
     swiftTimer = NSTimer.scheduledTimerWithTimeInterval(1, target:self, selector: #selector(SomeFunkyTableViewController.updateCounter), userInfo: nil, repeats: true) 
    } 


    if swiftCounter == 0 { 
     swiftTimer.invalidate() 
    } 


    pauseBtn.alpha = 1.0 

    playBtn.alpha = 0.5 

    stopBtn.alpha = 1.0 

} 


@IBOutlet weak var stopBtn: UIButton! 
@IBAction func stopButton(sender: AnyObject) { 

    currentCount = 0 
    circularProgressView.animateFromAngle(circularProgressView.angle, toAngle: 0, duration: 0.5, completion: nil) 

    circularProgressView.hidden = true 

    timerView.hidden = true 
    startView.hidden = false 



    swiftTimer.invalidate() 
    swiftCounter = 60 
    timerLabel.text = String(swiftCounter) 


    pauseBtn.alpha = 1.0 

    playBtn.alpha = 1.0 

    stopBtn.alpha = 0.5 
} 

func updateCounter() { 

    swiftCounter -= 1 
    timerLabel.text = String(swiftCounter) 

    if swiftCounter == 0 { 
     swiftTimer.invalidate() 
    } 
} 


} 

側注: - StartViewとTimerView私は2つの重複景色を眺めることができます。 1つはビューの読み込みに隠されているため、非表示/非表示の参照です。私はプレスプレイ/一時停止/停止のボタンを暗くします。

+0

アニメーションを一時停止した後.. circularProgressViewとは何ですか?角度ログ? – Shubhank

+0

@ katherine-jenkinsここの図書館員。将来Githubの問題を開くようにしてください。必要に応じてライブラリを一緒に改良することができます。問題を正しく理解している場合は、animateメソッドでrelativeDurationオプションを 'false'に設定してみてください。それはタイマとインクリメント/デクリメントを取り除くのに役立ちます。 –

答えて

3

アニメーションの一時停止と再開には特別なコードが必要です。使用しているライブラリを変更しなければ、それを行うことができない場合があります。

トリックは、アニメーションをホストしている親レイヤのアニメーションの速度を0に設定し、アニメーションの時間オフセットを記録することです。 iOSの10で始まる、新しい、より良い方法があることが

- (void) pauseLayer: (CALayer *) theLayer 
{ 
    CFTimeInterval mediaTime = CACurrentMediaTime(); 
    CFTimeInterval pausedTime = [theLayer convertTime: mediaTime fromLayer: nil]; 
    theLayer.speed = 0.0; 
    theLayer.timeOffset = pausedTime; 
} 

//----------------------------------------------------------------------------- 

- (void) removePauseForLayer: (CALayer *) theLayer; 
{ 
    theLayer.speed = 1.0; 
    theLayer.timeOffset = 0.0; 
    theLayer.beginTime = 0.0; 
} 

//----------------------------------------------------------------------------- 

- (void) resumeLayer: (CALayer *) theLayer; 
{ 
    CFTimeInterval pausedTime = [theLayer timeOffset]; 
    [self removePauseForLayer: theLayer]; 
    CFTimeInterval mediaTime = CACurrentMediaTime(); 
    CFTimeInterval timeSincePause = 
    [theLayer convertTime: mediaTime fromLayer: nil] - pausedTime; 
    theLayer.beginTime = timeSincePause; 
} 
+0

鮮やかなソリューション!迅速なバージョンを採用します。 –

+0

コードのSwift版を表示して解答を編集して、それを有効にして、「Swifty」バージョンのソリューションを提供することができます。また、あなたがこの回答が好きなら、アップ票が大いに評価されます –

0

注:ここでは

は一時停止して、アニメーションを再開し、私のプロジェクトの一つから(Objective-Cで書かれた)メソッドのカップルです一時停止して再開するUIViewアニメーション:UIViewPropertyAnimator

Githubにこの新しいUIViewPropertyAnimatorクラスを示すサンプルプロジェクト(Swiftで書かれています)があります。以下はUIViewPropertyAnimator-test

そのプロジェクトからのREADMEから抜粋されています:ここにリンクがあります

UIViewPropertyAnimatorは、あなたが簡単に一時停止することができUIViewのベースのアニメーションを作成することができますが、逆に、そして前後にスクラブ。

UIViewPropertyAnimatorオブジェクトは、UIViewクラスメソッドの古いanimate(withDuration:animations:)ファミリと非常によく似ています。しかし、UIViewPropertyAnimatorは、複数のアニメーションブロックを実行するために使用できます。

アニメータのfractionCompleteプロパティを設定して、アニメーションをスクラブする組み込みのサポートが組み込まれています。ただし、アニメーションの進行状況を自動で確認することはできません。

アニメーションをに変更することで、アニメーションをisReversedに設定することができますが、いくつかの違いがあります。実行中のアニメーターのisReversedプロパティをfalseからtrueに変更すると、アニメーションは元に戻りますが、アニメーションの実行中にisReversedプロパティをtrueからfalseに設定することはできません。最初にアニメーションを一時停止し、isReversedフラグを切り替えてアニメーションを再開する必要があります。 (自動車アナロジーを使用するには、移動中に前方から後方に切り替えることができますが、逆方向に戻ってからドライブに切り替える必要があります)