2014-05-20 70 views
13

我想標記我的UINavigationController是否具有動畫效果(push/pop)。完成轉換時io7導航檢查

我有一個布爾變量(_isAnimating),和下面的代碼似乎工作:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    _isAnimating = YES; 
} 

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    _isAnimating = NO; 
} 

但它在iOS7與滑動手勢工作不正確。假設我的導航是:root-> view A - > view B。我目前對B.

  • 在開始輕掃(去從B到A後),該funcion 「navigationController:willShowViewController:animated:(BOOL)animated」 被調用,那麼_isAnimating = YES

  • 正常情況下,刷卡完成(回到A),調用函數「navigationController:didShowViewController:animated:(BOOL)animated」,然後調用_isAnimating = NO。這種情況是可以的,但是:

  • 如果用戶可能只需滑動一半(向A轉換一半),則不想滑動到上一個視圖(視圖A),他再次轉到當前視圖(再次入住B)。然後函數「navigationController:didShowViewController:animated:(BOOL)animated」不被調用,我的變量有不正確的值(_isAnimating=YES)

我沒有機會在這個異常情況下更新我的變量。有沒有辦法更新導航狀態?謝謝!

+0

您是否嘗試過使用UIViewController的isBeingPresented屬性? – henryeverett

+0

Chào!你試過了嗎?viewWillAppear:'? –

+0

@henryeverett 和Thanh-NhonNGUYEN isBeingPresented和viewWillAppear:在A或B中。我的代碼不是A或B,它是另一個類(它是UINavigationController的委託,它的角色是導航管理器)。除此之外,我的代碼可能有許多視圖,有A,B,C,D,.....不僅A和B –

回答

4

的線索來解決你的問題可以在UINavigationController的interactivePopGestureRecognizer財產被發現。這是識別器,它響應用滑動手勢彈出控制器。您可以注意到,當用戶擡起手指時,識別器的狀態更改爲UIGestureRecognizerStateEnded。所以,還到導航控制器委託你應該添加目標到流行音樂識別器:

UIGestureRecognizer *popRecognizer = self.navigationController.interactivePopGestureRecognizer; 
[popRecognizer addTarget:self      
        action:@selector(navigationControllerPopGestureRecognizerAction:)]; 

這一行動將每次流行識別器改變被調用,包括手勢的結束。

- (void)navigationControllerPopGestureRecognizerAction:(UIGestureRecognizer *)sender 
{ 
    switch (sender.state) 
    { 
     case UIGestureRecognizerStateEnded: 

     // Next cases are added for relaibility 
     case UIGestureRecognizerStateCancelled: 
     case UIGestureRecognizerStateFailed: 

      _isAnimating = NO; 
      break; 

     default: 
      break; 
    } 
} 

P.S.不要忘記interactivePopGestureRecognizer屬性自iOS 7起可用!

+0

我對'UINavigationController'不是很好,如何檢測動畫結束後第一個或第二個視圖控制器是否會顯示?我曾嘗試使用'navigationController'屬性,但在方法內部爲null。此外,國家沒有用處,它總是在我的測試中結束。任何想法如何我可以檢測到這一點? – vrwim

+0

「第一個」和「第二個」控制器的含義是什麼?如果您需要了解用戶是否完成了手勢,您可以添加一個標誌'_swipeCompleted'並將其設置爲YES 'didShowViewController'方法,你也可以看看導航控制器的'viewControllers'屬性,它總是包含堆棧中的所有控制器,如果你需要知道在動畫結束之前哪個控制器將被顯示*,使用變量' viewController'被傳遞給'willShowViewController'。 – kelin