2017-04-18 6 views
1

私は、ビューの幅に設定されたビューと、将来(将来5分間で)何らかのポイントを取得するタイマーを持っています。 3 - 私の目標は、私がタイマーでUIViewの幅をアニメーション化するにはどうすればよいですか?

UIView.animate(withDuration: date.timeIntervalSinceNow, delay: 0, options: .curveEaseIn, animations: { 
    self.countdownBar?.frame = CGRect(x: 0, y:self.view.frame.maxY - 3, width: 0, height: 3) 
}, completion: nil) 

を行うにしようとしていた。しかし、それはmaxY位置だまで、これがビューの上部からcountdownBarアニメーションを作っていた0

までview.widthからビューの幅をアニメーション化することです幅ではなく

助けていただけたら幸いです!

編集:タイマコード

self.timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.countdownToCartExpiration), userInfo: nil, repeats: true) 

そしてcountdownToCartExpirationに、私はいくつかのUI分の特定の時間間隔で変化し、秒

答えて

3

あなたはタイマーまたはちょうどUIViewAnimationのようなものを使用する必要がありますいずれかを行います。

width0にアニメーション化したい場合は、5分間でこれを実行します。

var finalFrame = countdownBar!.frame 
finalFrame.size.width = 0 

UIView.animate(withDuration: 300, animations: { 
    self.countdownBar?.frame = finalFrame 
}) 

これは、ビューが画面の全幅であり、300秒間に0にアニメーション化されることを前提としています。また、AutoLayoutを使用してレイアウトを管理していないことを前提としています。 Autolayoutを使用している場合は、フレームを変更するのではなく、制約を変更するためにこれを調整する必要があります。

更新

だから、毎秒発射タイマーを有しているからです。我々はまだアニメ化したいと思うでしょう。タイマーが発射された場合、毎秒30分の1秒または60分ごとにフレームが調整され、滑らかに見えます。しかし毎秒は不安定に見えます。

func countdownToCartExpiration (timer: Timer) { 

    guard let countdownBar = countdownBar else { 
     return 
    } 

    // Assuming you're already tracking currentTime somehow 
    currentTime += timer.timeInterval 

    var finalFrame = countdownBar.frame 
    let totalTime = 300.0 

    finalFrame.size.width = view.frame.width * CGFloat(currentTime/totalTime) 

    UIView.animate(withDuration: timer.timeInterval, delay: 0, options: [.beginFromCurrentState, .curveLinear], animations: { 
     countdownBar.frame = finalFrame 
    }, completion: nil) 

    // ... Other stuff 
} 

. beginFromCurrentStateアニメーションが重複している場合は重要です。ここでは.curveLinearが重要です。なぜなら、アニメーションを連続して再生する場合、速度を一定にしたいからです。

私はcurrentTimeを追跡していると仮定し、このアニメーションのtotalTimeは300秒です。しかし、あなたは明らかに調整することができます。目標は、totalTimeのうちcurrentTimeの割合に幅を設定することです。

+0

私は既にタイマーを持っていますが、 'animate'ブロックよりむしろ使用するでしょう –

+0

btw、' finalFrame.width = 0'は "widthはget-onlyプロパティです" –

+0

'finalFrame.size.width'が必要です。私はそれを更新しました。タイマーに関しては、セットアップしたタイマーと呼び出す方法を投稿できますか?タイマーを使用して幅を手動で変更したい場合は、タイマー中に定期的にメソッドを呼び出す必要があります。これはプログレスバーのようなものですか? –

関連する問題