2017-07-03 5 views
1

たとえば、私は3つのビューコントローラを持っています:ABC、すべてがナビゲーションコントローラに組み込まれています。 AおよびBにはナビゲーションバーがあり、Cはありません。インタラクティブなトランジション:ナビゲーションバーの外観の問題

私はBCの間のカスタムインタラクティブな移行を持っています。私はCに消えるために私のナビゲーションバーを必要とするので、私はUINavigationControllerDelegateのこの機能を実装:私はプッシュポップ遷移する際

func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { 
    if viewController is C { 
     navigationController.setNavigationBarHidden(true, animated: animated) 
    } 
    else { 
     navigationController.setNavigationBarHidden(false, animated: animated) 
    } 
} 

すべては、一般的なシナリオでは完璧に動作します。

しかし、私は移行Bキャンセルとき - 私のUIPercentDrivenInteractiveTransitioncancel()を呼び出すことによって>Cを、ナビゲーションバーはBに表示されません。ここで私はsetNavigationBarHidden(false, ...)に電話しなければならないが、私はそれを行う正しい場所を見つけることができなかった。

BviewWillAppearで呼び出すと、ナビゲーションバーが表示されますが、実際には奇妙に見えます。ナビゲーションバーがある場合にはCの要素が含まれています。 Aにポップバックすると、コンテンツがある程度表示されてすぐに点滅しますが、移行後すぐにAナビゲーションバーがBナビゲーションバーに置き換えられます。ナビゲーションバーは、スタックのように

だから、それはそうは何とかB後に壊れている - >C遷移のキャンセル、そのようなviewcontrollersに相対的にシフトしているように見える:

     has 
----------------------------------------------- 
| ViewController | Navigation bar of | 
----------------------------------------------- 
|   A   |   B   | 
----------------------------------------------- 
|   B   |   C   | 
----------------------------------------------- 

だから、私の質問が正しい何ですこの場合、navigationController.setNavigationBarHidden(false, animated: true)に電話する場所はありますか?

答えて

1

まあ、私は自分でそれを修正するために醜いハックを見つけることができた。多分、この世界の誰かが助けてくれるでしょう。私のカスタムUIPercentDrivenInteractiveTransition

  • 私はそのようなcancel機能オーバーライドします:

    override func viewWillAppear(_ animated: Bool) { 
        super.viewWillAppear(animated) 
    
        // Hide and immediately show navigation bar: this will restore it's correct state 
        self.navigationController?.setNavigationBarHidden(true, animated: false) 
        self.navigationController?.setNavigationBarHidden(false, animated: true) 
    } 
    
  • :ビュー・コントローラ(A、B、C)のそれぞれにおいて

    class CustomTransitionManager: UIPercentDrivenInteractiveTransition { 
    
        /// Indicates transition direction. Must be set before each transition. 
        var forward: Bool = true 
    
        /// Current navigation controller used for transition. Must be set before transition starts 
        var nc: UINavigationController? 
    
        /** 
        * Hack #1 with UINavigationController here 
        */ 
        override func cancel() { 
         super.cancel() 
    
         if forward { 
          self.nc?.setNavigationBarHidden(false, animated: false) 
         } 
         self.nc?.setNavigationBarHidden(forward, animated: false) 
        } 
    } 
    
  • を私は以下のハックを作ります

ベストソリューションはおそらく012のモーダルフルスクリーン表示ですしかし、私の場合は、既にナビゲーション階層が壊れているプロジェクトで作業しており、正しく修正する時間がありませんでした。基本的に、それが私がこの問題に直面した理由です。

関連する問題