2017-05-14 110 views
4

我正在設計一個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

正如你所看到的,當新的控制器已經擁有新的動畫大小時,舊的視圖控制器可以正常動畫。

這裏是我的故事板的佈局: Storyboard

任何幫助將非常感激。我一直在試圖解決這一段時間沒有成功。

編輯:沒有應用* 2的動畫視圖。 https://imgur.com/a/2a5Sw

+0

不知道我是否正確理解你的問題,但我會使用UIViewControllerAnimatedTransitioning:隱藏你正在轉換的視圖控制器的導航欄,重新創建並將其添加到上下文中,將其高度動畫爲當動畫結束時,將其從上下文中移除並取消隱藏目標控制器的導航欄。它在用戶眼中似乎都是無縫的 – cyril

+0

所以,我不想對導航欄做任何事情,因爲我只是推送到導航控制器,所以新視圖沒有導航欄。我遇到的問題是,當一個UINavigationController的高度在視圖被推到它之前動畫時,被推送到導航控制器的視圖的高度具有未來的動畫高度,而不是被限制到其包含的導航的底部控制器。我不想從這個故事板過渡,只是將視圖推向其中的導航控制器。 – Jtvd78

回答

0

你有沒有想過不使用UINavigationController?也許這會更容易使用ChildViewControllers機制。然後,你可以使用一個強大的自動版式,並有更多的控制權動畫(在你的案件高度)

更多信息有關此here

+0

你認爲你可以提供一些關於如何去做這件事的更多細節?大多數指南都是針對非默認外觀轉換行爲,但我打算過渡到仍然看起來'股票' – Jtvd78

+0

你是什麼意思'股票'? –

+0

傳入視圖從左向右滑動。現在我想要做的就是改變UINavigationController的高度,但是當我在轉換之前激活高度動畫時,即使動畫還沒有完成,傳入視圖也會有新的高度。我不需要任何花哨的過渡。 – Jtvd78

0

我創建了一個可愛的小樣本項目,你可以找到here

有很多事情可能會出錯,而且由於我沒有親自查看過您的項目,所以我可能在樣本中組織了非常不同的事情,但希望您能理解它。我認爲最重要的是我在storyboard中爲navigationController的容器添加了一個約束到根viewController的底部。動畫時,我根本沒有調整這個容器的高度。

+0

我同意這會工作,但是然後我嘗試將其放入UINavigationController的每個視圖都必須實現代碼以確定它是否應該變小。它看起來像是UINavigationController的默認轉換,它將新推動的控制器的高度設置爲未來的動畫高度,而不是將推送的視圖限制在導航控制器視圖的底部。這是我可以用UIViewControllerAnimatedTransitioning修改嗎? – Jtvd78

+0

我只是想澄清一下,我不是從一個故事板移動到另一個故事板。我只是將視圖推向UINavigationController。我知道我的故事板並不常見,因爲我是從Android開發而來的,但我不認爲這個問題與故事板本身有關,而只是UINavigationController的默認行爲。我已經用動畫的一個不誇張的版本更新了主帖。感謝您到目前爲止的幫助 – Jtvd78

+0

嗯第二個示例現在有一點幫助,我注意到您的根控制器是pageController。讓我看看我是否可以快速舉一個例子,稍後我會再回來查看 – mmd1080

相關問題