2010-03-05 117 views
2

我正在開發基於導航的應用程序。我有幾個視圖控制器,我在不同場合推送到導航控制器。以下是我用來推送新View Controller的代碼。禁用導航欄的動畫

AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil]; 
[self.navigationController pushViewController:anotherViewController animated:YES]; 
[anotherViewController release]; 

我注意到的一件事是,當新的視圖控制器被推動導航欄也動畫(滑動)。我在導航欄中有一個後退按鈕,標題文本和右鍵。所以當導航欄動畫時它看起來很奇怪。

是否有任何解決方法來保持導航欄的固定,並且視圖僅在推動新視圖控制器時才動畫?

回答

0

我嘗試了很多不同的方法,但沒有任何工作。最後,我使用了一種解決方法:

1)將第一個視圖控制器的當前視圖(self.view)切換到第二個視圖控制器 2)淡入淡出的過渡。將第二個視圖控制器設置爲動畫的委託,以通知第二個控制器是否完成轉換 3)在第二個視圖控制器的viewDidLoad中保存第二個視圖控制器的視圖並將第一個視圖的視圖設置爲self.view

現在,顯示器應該與第一個視圖控制器的內容看起來像第二個視圖控制器的導航欄(如果有的話,還有工具欄)。

最後在第二個視圖控制器(在委託動畫的方法中)中執行要爲內容執行的轉換,例如翻轉。

基本上是有效的。我仍然需要解決一些視圖正確位置的問題,並在我的應用的第一個視圖控制器中恢復視圖。

但是這應該至少給你一個提示。

更新:修復了剩餘的問題。這有點棘手,因爲第一個視圖控制器駐留在滾動視圖中。翻轉並不是什麼大不了的事情,但是翻回滾動視圖是一件令人討厭的事情。

-1

導航欄在Apple的Photo應用程序中查看圖像時隱藏,以提供更好的圖像視圖。隱藏導航欄很容易。雖然與Photo應用程序不完全相同,但此技巧將隱藏並顯示導航欄,並帶有一個用於爲轉換設置動畫的選項。

+1

這不回答這個問題。 – 2012-12-06 01:01:47

0

斯威夫特

雖然艱苦但可行的解決方案:

您需要使用UINavigationController委託方法找出正在顯示UIViewController時。然後對於每個UIViewController,需要創建一個像isInitialized屬性的布爾變量,它可以幫助您確定何時將UIViewController推入堆棧,或者何時將其顯示在下一個視圖控制器的背面。

你FirstViewController:

func navigationController(_ navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { 
     if viewController == self { 
      if self.isInitialized { 
       var navigationBarAnimation = CATransition() 
       navigationBarAnimation.duration = 1.5 
       navigationBarAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 
       navigationBarAnimation.type = kCATransitionFade 
       navigationBarAnimation.subtype = kCATransitionFade 
       navigationBarAnimation.removedOnCompletion = true 
       self.navigationController?.navigationBar?.layer?.addAnimation(navigationBarAnimation, forKey: nil) 
       } 
       else 
       { 
         self.isInitialized = true; 
       } 
     } 
} 

func navigationController(_ navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { 
     if viewController == self { 
      if self.isInitialized { 
       self.navigationController?.navigationBar?.layer?.removeAllAnimations() 
      } 
     } 
} 

你SecondViewController:

func navigationController(_ navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { 
     if viewController == self { 
      if !self.isInitialized { 
       var navigationBarAnimation = CATransition() 
       navigationBarAnimation.duration = 1.5 
       navigationBarAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 
       navigationBarAnimation.type = kCATransitionFade 
       navigationBarAnimation.subtype = kCATransitionFade 
       navigationBarAnimation.removedOnCompletion = true 
       self.navigationController?.navigationBar?.layer?.addAnimation(navigationBarAnimation, forKey: nil) 
         self.isInitialized = true; 
       } 
     } 
} 

func navigationController(_ navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { 
     if viewController == self { 
      if self.isInitialized { 
       self.navigationController?.navigationBar?.layer?.removeAllAnimations() 
      } 
     } 
}