2017-04-18 34 views
1

我有一個視圖,它被設置爲我的視圖的寬度和一個計時器,它可以在未來(在接下來的5分鐘內)獲得某個點。我的目標是動畫視圖的從view.width寬度降低到0如何使用計時器設置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) 

但是,這使得從視圖頂部countdownBar有生下來到它的maxY位置 - 3而不是寬度

任何幫助,將不勝感激!

編輯:定時器代碼

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

而在countdownToCartExpiration我在幾分鐘內特定時間間隔秒

回答

3

一些用戶界面的變化和您應該使用類似定時器或只是一個UIViewAnimation。

如果你想動畫width下降到0在5分鐘的過程中,那麼你會做這樣的事情。

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

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

這裏假設視圖是屏幕的整個寬度,並且將在300秒內將其動畫化爲零。它還假定你沒有使用AutoLayout來管理你的佈局。如果您使用的是Autolayout,那麼我們需要調整它以更改約束而不是更改框架。

更新

那麼既然你有一個計時器發射的每一秒。我們仍然想要製作可能的動畫。如果計時器每隔30秒或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是重要的incase動畫發生重疊。 .curveLinear在這裏很重要,因爲動畫播放時我們希望速度保持不變。

我假設您正在跟蹤currentTime,並且此動畫的totalTime爲300秒。但你可以明顯調整。目標是將寬度設置爲currentTime中totalTime的百分比。

+0

我已經有一個計時器去,我寧願使用比'animate'塊 –

+0

順便說一句,'finalFrame.width = 0'引發錯誤「寬度是一個只能得到的屬性」 –

+0

哎呀是啊,你會需要'finalFrame.size.width'。我已經更新了它。至於計時器,你可以發佈你設定的計時器和你打電話的方法嗎?如果您想使用計時器手動更改寬度,那麼我們需要在計時器中定期調用一個方法。這是否就像進度條? –