2014-01-24 23 views
6

我正在展示一個模式UINavigationController與交互式解僱過渡。父視圖控制器有一個黑暗的狀態欄和模式視圖控制器一個燈光狀態欄。我正在使用基於iOS 7視圖控制器的狀態欄外觀配置。交互式視圖控制器解僱和更改statusBarStyle不兼容?

只要我以非交互方式呈現和解除視圖控制器,所有工作都可以正常工作。但是,當我開始交互式解散轉換並取消它時,狀態欄顏色仍然很暗。我建立了sample project。點擊「菜單」按鈕,然後通過從右邊的屏幕邊緣進行平移來啓動交互式過渡。

事情我已經嘗試:

  • 呼籲所涉及的任何導航視圖控制器的-setNeedsStatusBarAppearanceUpdate後的過渡已經取消
  • 改變navigationBar.barStyle到UIBarStyleDefault和回UIBarStyleBlack

我還驗證了我的模態導航控制器的statusBarStyle設置正確:

(lldb) p (UIStatusBarStyle) [[[[[UIApplication sharedApplication] keyWindow] rootViewController] presentedViewController] preferredStatusBarStyle] 
(UIStatusBarStyle) $8 = UIStatusBarStyleLightContent 

不過,狀態欄是黑色的。

任何進一步的想法,我可以嘗試嗎?

回答

6

對我來說,這看起來像一個錯誤(rdar://15902745)在UINavigationController。在取消解僱後,UINavigationController不會再次查詢其presentedViewControllerpreferredStatusBarStyle,而是自己使用preferredStatusBarStyle。我工作圍繞這通過覆蓋-childViewControllerForStatusBarStyle

- (UIViewController*)childViewControllerForStatusBarStyle { 
    if (self.presentedViewController) { 
     return self.presentedViewController.childViewControllerForStatusBarStyle; 
    } 

    return [super childViewControllerForStatusBarStyle]; 
} 

然後,動畫中的變化(而不是之後)被解僱,我也改寫-preferredStatusBarStyle

我把解決方法推到sample project

+0

完全合理。然而,當presentViewController不是零時,我會遇到某種碰撞,但是轉換剛剛結束。所以基本上首選的是在目標控制器的viewDidAppear [interactive dismiss]之前查詢StatusBarStyle。 – Andy

+1

根據您的示例項目,您可以在NVC做更多的工作,正如我所設想的那樣。 https://github.com/futuretap/UIViewController-Transitions-Example/blob/master/UIViewController-Transitions-Example/FTNavigationController.m。謝謝你的樣品! – Andy

0

不要忘記調用

[self.transitionContext cancelInteractiveTransition]; 

您的UIPercentDrivenInteractiveTransition子類中- (void)cancelInteractiveTransition實施。爲了尋找靈感,這是我實現

- (void)cancelInteractiveTransition { 

id<UIViewControllerContextTransitioning> transitionContext = self.transitionContext; 
[transitionContext cancelInteractiveTransition]; 

UIView *fromView = [UIViewController fromViewForTransitioningContext:transitionContext]; 
UIView *toView = [UIViewController toViewForTransitioningContext:transitionContext]; 

if (self.presenting) 
{ 
    CGRect endFrame = CGRectOffset([[transitionContext containerView] bounds], 0, CGRectGetHeight([[transitionContext containerView] bounds])); 

    [UIView animateWithDuration:ANIMATION_DURATION_PAN animations:^{ 

     toView.frame = endFrame; 

    } completion:^(BOOL finished) { 

     [transitionContext completeTransition:NO]; 
    }]; 
} 
else { 

    CGRect endFrame = [[transitionContext containerView] bounds]; 

    [UIView animateWithDuration:ANIMATION_DURATION_PAN animations:^{ 
     fromView.frame = endFrame; 
    } completion:^(BOOL finished) { 
     [transitionContext completeTransition:NO]; 
    }]; 
} 

}

編輯:這似乎有助於在iOS 8.4。測試7.1但沒有辦法。也許蘋果最近修復了它。

相關問題