我正在設計一個swift的iOS應用程序,並且在控制器轉換期間我有一些動畫難度。具體來說,我已經實現了一個UINavigationControllerDelegate,來監聽某個視圖何時被推送。當這個視圖被按下時,我想隱藏屏幕底部的一個條。我的代碼幾乎完美地工作,但是無論何時我在導航控制器的高度上開始動畫時,當前視圖(正在被刪除)正確地爲其高度設置了動畫,但是正在被推送的新控制器已經從動畫。把一些代碼,執行下面的功能是從我UINavigationControllerDelegate的willShow的viewController函數調用:在控制器轉換期間動畫UINavigationController高度
func animatePlayerVisibility(_ visible: Bool) {
if visible == showingPlayer {
return
}
showingPlayer = visible
let height: CGFloat = visible ? 56.0 : 0.0
self.view.layoutIfNeeded()
UIView.animate(withDuration: 0.35) {
self.playerHeight.constant = height
self.viewBottom.constant = height
self.view.layoutIfNeeded()
}
}
「playerHeight」是一個IBOutlet到播放器上的容器視線的高度約束。 'viewBottom'也是頂部容器視圖底部和屏幕底部之間的IBOutlet約束。從本質上講,只要這兩個約束一起動畫,它應該看起來不錯。
爲了幫助可視化的圖形錯誤,我編輯這行
self.viewBottom.constant = height
到
self.viewBottom.constant = height * 2.0
我在操作創建實際的錯誤行爲的imgur專輯: http://imgur.com/a/znAim
正如你所看到的,當新的控制器已經擁有新的動畫大小時,舊的視圖控制器可以正常動畫。
任何幫助將非常感激。我一直在試圖解決這一段時間沒有成功。
編輯:沒有應用* 2的動畫視圖。 https://imgur.com/a/2a5Sw
不知道我是否正確理解你的問題,但我會使用UIViewControllerAnimatedTransitioning:隱藏你正在轉換的視圖控制器的導航欄,重新創建並將其添加到上下文中,將其高度動畫爲當動畫結束時,將其從上下文中移除並取消隱藏目標控制器的導航欄。它在用戶眼中似乎都是無縫的 – cyril
所以,我不想對導航欄做任何事情,因爲我只是推送到導航控制器,所以新視圖沒有導航欄。我遇到的問題是,當一個UINavigationController的高度在視圖被推到它之前動畫時,被推送到導航控制器的視圖的高度具有未來的動畫高度,而不是被限制到其包含的導航的底部控制器。我不想從這個故事板過渡,只是將視圖推向其中的導航控制器。 – Jtvd78