UINavigationControllerでナビゲーションバーを非表示にするときにスワイプバックしない


86

ビューをに埋め込むことで継承されたスワイプパックが大好きUINavigationControllerです。残念ながら、非表示にする方法が見つからないようですNavigationBarが、タッチパンをスワイプして戻しgestureます。カスタムジェスチャを書くことはできますが、代わりにUINavigationControllerバックスワイプを使用せず、それに依存することを好みgestureます。

ストーリーボードでチェックを外すと、バックスワイプが機能しません

ここに画像の説明を入力してください

あるいは、プログラムで非表示にした場合も、同じシナリオです。

トップを非表示にしNavigationBarてスワイプする方法はありませんか?


1
UIGestureRecognizerの追加は受け入れられますか?実装するのは簡単です。
SwiftArchitect 2014

1
@ LancelotdelaMare、UINavigationControllerのバックスワイプほどスムーズに機能しないため、これを回避しようとしていました。UIScreenEdgePanGestureRecognizerを調べているのは、それが役立つと言う人もいますが、まだ機能するようになっていないからです。ここで最もシンプルでエレガントなソリューションを探しています。
mihai 2014

回答:


98

働いているハックが設定しているinteractivePopGestureRecognizerののデリゲートをUINavigationControllerするnil。このように:

[self.navigationController.interactivePopGestureRecognizer setDelegate:nil];

しかし、状況によっては、奇妙な効果を生み出す可能性があります。


16
「繰り返しスワイプすると、スタックにView Controllerが1つしかない場合にジェスチャが認識される可能性があります。これにより、UIが(UIKitエンジニアには予期しない)状態になり、ジェスチャの認識が停止します」
HorseT

4
その予想外の状態から守るかもしれない代替手段はいくつかの低レベルのオブジェクトに設定し(私は私のアプリデリゲートを使用)して実施することになりgestureRecognizerShouldBegin、戻っtrueた場合navigationControllerviewControllerカウントが0よりも大きい
ケニー・ウィンカー

4
これは機能しますが、これには強くお勧めします。デリゲートを壊すと、まれで、メインスレッドブロックを特定するのが困難になりました。メインスレッドブロックではなく、@ HorseTが説明したものであることがわかります。
Josh Bernfeld 2015

3
私のアプリはデリゲートハンドルを保存してから復元しますがviewWillDisappear、これまでのところ有害な副作用は発生していません。
ドン・パーク

1
!!!! このソリューションの使用は強くお勧めしません。スワイプを繰り返し使用すると奇妙な動作が発生し、背面が無効になり、アプリ全体が応答しなくなります
KarimIhab 2016年

81

他の方法の問題

を設定すると、interactivePopGestureRecognizer.delegate = nil意図しない副作用が発生します。

設定navigationController?.navigationBar.hidden = trueは機能しますが、ナビゲーションバーの変更を非表示にすることはできません。

最後に、UIGestureRecognizerDelegateナビゲーションコントローラー用のモデルオブジェクトを作成することをお勧めします。UINavigationControllerスタック内のコントローラーに設定すると、EXC_BAD_ACCESSエラーが発生します。

フルソリューション

まず、このクラスをプロジェクトに追加します。

class InteractivePopRecognizer: NSObject, UIGestureRecognizerDelegate {

    var navigationController: UINavigationController

    init(controller: UINavigationController) {
        self.navigationController = controller
    }

    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return navigationController.viewControllers.count > 1
    }

    // This is necessary because without it, subviews of your top controller can
    // cancel out your gesture recognizer on the edge.
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
}

次に、ナビゲーションコントローラーをinteractivePopGestureRecognizer.delegate新しいInteractivePopRecognizerクラスのインスタンスに設定します。

var popRecognizer: InteractivePopRecognizer?

override func viewDidLoad() {
    super.viewDidLoad()
    setInteractiveRecognizer()
}

private func setInteractiveRecognizer() {
    guard let controller = navigationController else { return }
    popRecognizer = InteractivePopRecognizer(controller: controller)
    controller.interactivePopGestureRecognizer?.delegate = popRecognizer
}

トップコントローラーにテーブル、コレクション、またはスクロールビューのサブビューがある場合でも機能する、副作用のない非表示のナビゲーションバーをお楽しみください。


2
素晴らしい解決策!
マットバトラー

2
最良の答え、ありがとう!
ドリーダニエル

3
@HunterMaximillionMonk素晴らしいソリューションをありがとう。それは魅力のように機能します
2017

2
間違いなくベストアンサー!
daxh 2017年

2
iOS 13.5、12.4.6、および10.3.4で動作しました。ありがとう。
ДенисПопов

55

私の場合、奇妙な影響を防ぐために

ルートビューコントローラー

override func viewDidLoad() {
    super.viewDidLoad()

    // Enable swipe back when no navigation bar
    navigationController?.interactivePopGestureRecognizer?.delegate = self
}

// UIGestureRecognizerDelegate
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    if let navVc = navigationController {
      return navVc.viewControllers.count > 1
    }
    return false
}

2
これを使用すると、EXC_BAD_ACCESSが発生することがあります
Andrey Gordeev

私にとって、それはジェスチャーを機能させず、頻繁にクラッシュしますEXEC_BAD_ACCESS
ベンジョン2015

2
UIGestureRecognizerDelegateルートビューコントローラーに追加することを忘れないでください...私の場合、デリゲートはルートビューコントローラーよりも後のビューコントローラーでnilに設定されていたため、ルートビューコントローラーに戻ったときにgestureRecognizerShouldBegin呼び出されませんでした。だから私はに入れまし.delegate = selfviewDidAppear()。それは私の場合の奇妙な効果を解決しました..乾杯!
Wiingaard 2015年

@AndreyGordeevいつEXEC_BAD_ACCESS起こるかについて詳細を教えてください。
Jaybo 2016年

EXC_BAD_ACCESSエラーの詳細は次のとおりです。stackoverflow.com
questions / 28746123

25

iOS13.4用に更新

iOS 13.4は以前の解決策を破ったので、物事は醜くなるでしょう。iOS 13.4では、この動作はプライベートメソッドによって制御さ_gestureRecognizer:shouldReceiveEvent:れるようになりshouldReceiveました(iOS 13.4で追加された新しいパブリックメソッドと混同しないでください)。


デリゲートをオーバーライドしたり、nilに設定したりすると、他の投稿されたソリューションが予期しない動作を引き起こすことがわかりました。

私の場合、ナビゲーションスタックの一番上にいて、ジェスチャを使用してもう一度ポップしようとすると、(予想どおり)失敗しましたが、スタックにプッシュしようとすると、奇妙なグラフィックの不具合が発生し始めました。ナビゲーションバー。これは理にかなっています。なぜなら、デリゲートは、ナビゲーションバーが非表示になっているときにジェスチャが認識されないようにブロックするかどうかだけでなく、他のすべての動作が破棄されているためです。

私のテストから、gestureRecognizer(_:, shouldReceiveTouch:)ナビゲーションバーが非表示になっているときにジェスチャが認識されないようにするために、元のデリゲートが実装している方法のようgestureRecognizerShouldBegin(_:)です。の実装gestureRecognizerShouldBegin(_:)がないためにデリゲートで実装される他のソリューションgestureRecognizer(_:, shouldReceiveTouch:)は、すべてのタッチを受信するデフォルトの動作を引き起こします。

@Nathan Perryのソリューションは近づいていますが、の実装がないrespondsToSelector(_:)と、デリゲートにメッセージを送信するUIKitコードは、他のデリゲートメソッドの実装がないと信じて、forwardingTargetForSelector(_:)呼び出されることはありません。

したがって、動作を変更する1つの特定のシナリオでは、 `gestureRecognizer(_:、shouldReceiveTouch :)を制御し、それ以外の場合はすべてをデリゲートに転送します。

class AlwaysPoppableNavigationController : UINavigationController {

    private var alwaysPoppableDelegate: AlwaysPoppableDelegate!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.alwaysPoppableDelegate = AlwaysPoppableDelegate(navigationController: self, originalDelegate: self.interactivePopGestureRecognizer!.delegate!)
        self.interactivePopGestureRecognizer!.delegate = self.alwaysPoppableDelegate
    }
}

private class AlwaysPoppableDelegate : NSObject, UIGestureRecognizerDelegate {

    weak var navigationController: AlwaysPoppableNavigationController?
    weak var originalDelegate: UIGestureRecognizerDelegate?

    init(navigationController: AlwaysPoppableNavigationController, originalDelegate: UIGestureRecognizerDelegate) {
        self.navigationController = navigationController
        self.originalDelegate = originalDelegate
    }

    // For handling iOS before 13.4
    @objc func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        if let navigationController = navigationController, navigationController.isNavigationBarHidden && navigationController.viewControllers.count > 1 {
            return true
        }
        else if let originalDelegate = originalDelegate {
            return originalDelegate.gestureRecognizer!(gestureRecognizer, shouldReceive: touch)
        }
        else {
            return false
        }
    }

    // For handling iOS 13.4+
    @objc func _gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceiveEvent event: UIEvent) -> Bool {
        if let navigationController = navigationController, navigationController.isNavigationBarHidden && navigationController.viewControllers.count > 1 {
            return true
        }
        else if let originalDelegate = originalDelegate {
            let selector = #selector(_gestureRecognizer(_:shouldReceiveEvent:))
            if originalDelegate.responds(to: selector) {
                let result = originalDelegate.perform(selector, with: gestureRecognizer, with: event)
                return result != nil
            }
        }

        return false
    }

    override func responds(to aSelector: Selector) -> Bool {
        if #available(iOS 13.4, *) {
            // iOS 13.4+ does not need to override responds(to:) behavior, it only uses forwardingTarget
            return originalDelegate?.responds(to: aSelector) ?? false
        }
        else {
            if aSelector == #selector(gestureRecognizer(_:shouldReceive:)) {
                return true
            }
            else {
                return originalDelegate?.responds(to: aSelector) ?? false
            }
        }
    }

    override func forwardingTarget(for aSelector: Selector) -> Any? {
        if #available(iOS 13.4, *), aSelector == #selector(_gestureRecognizer(_:shouldReceiveEvent:)) {
            return nil
        }
        else {
            return self.originalDelegate
        }
    }
}

1
あなたのソリューションが現時点で最適のようです。ありがとう!
ティムールベルニコビッチ2017年

「しかし、その後スタックにプッシュしようとすると、ナビゲーションバーに奇妙なグラフィックの不具合が発生し始めます」-私はここで混乱しています。ナビゲーションバーがないと思った?それが問題です?私の状況では、ナビゲーションコントローラーがナビゲーションバーのない子ビューコントローラーとして埋め込まれています。含まれているVCにはナビゲーションコントロールがあります。そのため、含まれているVCを認識機能の代理人にしてgestureRecognizerShouldBegin:、それを実行したところ、「機能しているようです」。私は気をつけるべきだろうかと思います。
skagedal 2017

2
これはnavigationControllerAlwaysPoppableDelegateの強参照であったため、メモリリークが発生しました。これをweak参照するためにコードを編集しました。
Graham Perks 2017年

3
この優れたソリューションは、iOS 13.4では機能しなくなりました
Ely

@ChrisVasselli本当にすごい、ありがとう!うまくいけば、これはAppStoreレビューのプライベートメソッドチェックに合格するでしょう。
イーリー

16

UINavigationControllerは次のようにサブクラス化できます。

@interface CustomNavigationController : UINavigationController<UIGestureRecognizerDelegate>

@end

実装:

@implementation CustomNavigationController

- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated {
    [super setNavigationBarHidden:hidden animated:animated];
    self.interactivePopGestureRecognizer.delegate = self;
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if (self.viewControllers.count > 1) {
        return YES;
    }
    return NO;
}

@end

2
このアプローチを使用すると、UIPageViewControllerオーバースクロールでポップジェスチャが壊れます。
atulkhatri 2016

viewController.count> 1のチェックが必要であることがわかりました。ユーザーがルートVCのみでスワイプして戻ろうとすると、UIは次のVCプッシュでハングします。
VaporwareWolf 2017年

12

シンプルで副作用なし回答

ここでのほとんどの回答は適切ですが、意図しない副作用(アプリの破損)があるか、冗長であるように見えます。

私が思いついた最もシンプルで機能的なソリューションは次のとおりです。

ナビゲーションバーを非表示にしているViewControllerで、

class MyNoNavBarViewController: UIViewController {
    
    // needed for reference when leaving this view controller
    var initialInteractivePopGestureRecognizerDelegate: UIGestureRecognizerDelegate?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // we will need a reference to the initial delegate so that when we push or pop.. 
        // ..this view controller we can appropriately assign back the original delegate
        initialInteractivePopGestureRecognizerDelegate = self.navigationController?.interactivePopGestureRecognizer?.delegate
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)

        // we must set the delegate to nil whether we are popping or pushing to..
        // ..this view controller, thus we set it in viewWillAppear()
        self.navigationController?.interactivePopGestureRecognizer?.delegate = nil
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(true)

        // and every time we leave this view controller we must set the delegate back..
        // ..to what it was originally
        self.navigationController?.interactivePopGestureRecognizer?.delegate = initialInteractivePopGestureRecognizerDelegate
    }
}

他の回答は、単にデリゲートをnilに設定することを提案しています。ナビゲーションスタックの最初のViewControllerに戻ると、すべてのジェスチャが無効になります。おそらく、UIKit / UIGesture開発者のある種の見落とし。

同様に、私が実装したここでのいくつかの回答は、非標準のアップルナビゲーション動作をもたらしました(具体的には、後方にスワイプしながら上下にスクロールする機能を可能にします)。これらの答えも少し冗長に見え、場合によっては不完全です。


viewDidLoad()キャプチャするには良い場所ではないinitialInteractivePopGestureRecognizerDelegateので、navigationControllerそこはnil(まだスタックにプッシュしない)することができます。viewWillAppearあなたは、ナビゲーションバーがより適切であろう隠れている場所の
nCod3d

10

オフ構築ハンターMaximillionモンクの答え、私はUINavigationControllerのためのサブクラスを作り、その後、私のストーリーボードで私UINavigationControllerのカスタムクラスを設定します。2つのクラスの最終的なコードは次のようになります。

InteractivePopRecognizer:

class InteractivePopRecognizer: NSObject {

    // MARK: - Properties

    fileprivate weak var navigationController: UINavigationController?

    // MARK: - Init

    init(controller: UINavigationController) {
        self.navigationController = controller

        super.init()

        self.navigationController?.interactivePopGestureRecognizer?.delegate = self
    }
}

extension InteractivePopRecognizer: UIGestureRecognizerDelegate {
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return (navigationController?.viewControllers.count ?? 0) > 1
    }

    // This is necessary because without it, subviews of your top controller can cancel out your gesture recognizer on the edge.
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
}

HiddenNavBarNavigationController:

class HiddenNavBarNavigationController: UINavigationController {

    // MARK: - Properties

    private var popRecognizer: InteractivePopRecognizer?

    // MARK: - Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()
        setupPopRecognizer()
    }

    // MARK: - Setup

    private func setupPopRecognizer() {
        popRecognizer = InteractivePopRecognizer(controller: self)
    }
}

ストーリーボード:

ストーリーボードナビゲーションコントローラーカスタムクラス


8

@ChrisVasseliが提供するソリューションが最適のようです。質問はObjective-Cに関するものなので、Objective-Cでも同じソリューションを提供したいと思います(タグを参照)

@interface InteractivePopGestureDelegate : NSObject <UIGestureRecognizerDelegate>

@property (nonatomic, weak) UINavigationController *navigationController;
@property (nonatomic, weak) id<UIGestureRecognizerDelegate> originalDelegate;

@end

@implementation InteractivePopGestureDelegate

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if (self.navigationController.navigationBarHidden && self.navigationController.viewControllers.count > 1) {
        return YES;
    } else {
        return [self.originalDelegate gestureRecognizer:gestureRecognizer shouldReceiveTouch:touch];
    }
}

- (BOOL)respondsToSelector:(SEL)aSelector
{
    if (aSelector == @selector(gestureRecognizer:shouldReceiveTouch:)) {
        return YES;
    } else {
        return [self.originalDelegate respondsToSelector:aSelector];
    }
}

- (id)forwardingTargetForSelector:(SEL)aSelector
{
    return self.originalDelegate;
}

@end

@interface NavigationController ()

@property (nonatomic) InteractivePopGestureDelegate *interactivePopGestureDelegate;

@end

@implementation NavigationController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.interactivePopGestureDelegate = [InteractivePopGestureDelegate new];
    self.interactivePopGestureDelegate.navigationController = self;
    self.interactivePopGestureDelegate.originalDelegate = self.interactivePopGestureRecognizer.delegate;
    self.interactivePopGestureRecognizer.delegate = self.interactivePopGestureDelegate;
}

@end

3
ObjCはまだ死んでいないからです!😉–
MonsieurDart

2
これが正しい解決策です。元のデリゲートに転送されないその他のソリューションは正しくありません。
Josh Bernfeld 2017年

6

私の解決策は、UINavigationControllerクラスを直接拡張することです。

import UIKit

extension UINavigationController: UIGestureRecognizerDelegate {

    override open func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        self.interactivePopGestureRecognizer?.delegate = self
    }

    public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return self.viewControllers.count > 1
    }

}

このように、すべてのナビゲーションコントローラーはスライドすることで閉じることができます。


奇妙なことに、これviewDidAppearにより、ナビゲーションコントローラーに属するVCでのすべての呼び出しが無視されます。
cumanzor

4

プロキシデリゲートを使用してそれを行うことができます。ナビゲーションコントローラーを構築するときは、既存のデリゲートを取得します。そしてそれをプロキシに渡します。次に、をgestureRecognizer:shouldReceiveTouch:使用する場合を除いて、すべてのデリゲートメソッドを既存のデリゲートに渡します。forwardingTargetForSelector:

セットアップ:

let vc = UIViewController(nibName: nil, bundle: nil)
let navVC = UINavigationController(rootViewController: vc)
let bridgingDelegate = ProxyDelegate()
bridgingDelegate.existingDelegate = navVC.interactivePopGestureRecognizer?.delegate
navVC.interactivePopGestureRecognizer?.delegate = bridgingDelegate

プロキシデリゲート:

class ProxyDelegate: NSObject, UIGestureRecognizerDelegate {
    var existingDelegate: UIGestureRecognizerDelegate? = nil

    override func forwardingTargetForSelector(aSelector: Selector) -> AnyObject? {
        return existingDelegate
    }

    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
        return true
    }  
}

この答えは本当のObj-Cスタイルです!
Sound Blaster

forwardingTargetForSelectorは、私がそれについて知っていれば、過去のプロジェクトで多くの時間を節約できたでしょう。良いもの!
VaporwareWolf 2017年

4

Hunter Monkの答えは本当に素晴らしいですが、残念ながらiOS13.3.1では機能しません。

隠れUINavigationBarて負けない別の方法を説明しますswipe to back gestureます。iOS 13.3.1と12.4.3でテストしましたが、動作します。

のカスタムクラスを作成し、UINavigationControllerそのクラスをUINavigationControllerで設定する必要がありますStoryboard

カスタムクラスを<code> UINavigationController </ code>に設定します

隠さないNavigationBarでをStoryboard

<code> UINavigationController </ code>属性インスペクター:

Storyboard

ストーリーボード:

そして最後に、これを置く:navigationBar.isHidden = trueviewDidLoadCustomNavigationControllerクラス。

を非表示にするためにこのメソッドsetNavigationBarHidden(true, animated: true)を使用しないでくださいNavigationBar

import UIKit

class CustomNavigationController: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationBar.isHidden = true
    }
}

2
私はこれを実際のデバイスのiPhone6S PlusでテストしiOS 13.4.1、スワイプバックで動作しました。
エムレアイドゥン

1

Xamarin Answer:

IUIGestureRecognizerDelegateViewControllerのクラス定義にインターフェイスを実装します。

public partial class myViewController : UIViewController, IUIGestureRecognizerDelegate

ViewControllerに、次のメソッドを追加します。

[Export("gestureRecognizerShouldBegin:")]
public bool ShouldBegin(UIGestureRecognizer recognizer) {
  if (recognizer is UIScreenEdgePanGestureRecognizer && 
      NavigationController.ViewControllers.Length == 1) {
    return false;
  }
  return true;
}

ViewControllerにViewDidLoad()次の行を追加します。

NavigationController.InteractivePopGestureRecognizer.Delegate = this;

おそらくこれはUINavigationControllerのルートビューコントローラにありますか?私が取得EXEC_BAD_ACCESS私はこれをしようとします。
ベンジョン2015

ルートビューコントローラーでエッジパンを実行できますか?ルートVCにいるときは、他のすべてのVCをポップしました、そして、あなたのナビゲーションのVC配列の長さは1でなければなりませんので、それは可能であるべきではない
アフマド

クラッシュは、を呼び出す前に発生しgestureRecognizerShouldBegin:ます。
ベンジョン2015

1
VCコードを新しい質問またはXamarinフォーラムに投稿できますか?
アフマド

いいえ、していません。.1のままにしておこうと思います!
ベンジョン2015年

1

私はこれを試しましたが、完全に機能しています: スライドバック機能を失うことなくナビゲーションバーを非表示にする方法

アイデアは、「UIGestureRecognizerDelegate」を.hに実装し、これを.mファイルに追加することです。

- (void)viewWillAppear:(BOOL)animated {
// hide nav bar
[[self navigationController] setNavigationBarHidden:YES animated:YES];

// enable slide-back
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
    self.navigationController.interactivePopGestureRecognizer.enabled = YES;
    self.navigationController.interactivePopGestureRecognizer.delegate = self;
  }
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
   return YES;  
}

1

これが私の解決策です:ナビゲーションバーのアルファを変更していますが、ナビゲーションバーは非表示になりません。すべてのViewControllerはBaseViewControllerのサブクラスであり、次のものがあります。

    override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    navigationController?.navigationBar.alpha = 0.0
}

UINavigationControllerをサブクラス化して、そのメソッドをそこに配置することもできます。


0

代わりにsetNavigationBarHiddenanimatedでメソッドを呼び出すことで成功したもいYESます。


私は運を試しませんでした。この提案をカバーするために私の答えを更新します。
mihai 2014

0

ナビゲーションバーのないビューコントローラーでは、

open override func viewWillAppear(_ animated: Bool) {
  super.viewWillAppear(animated)

  CATransaction.begin()
  UIView.animate(withDuration: 0.25, animations: { [weak self] in
    self?.navigationController?.navigationBar.alpha = 0.01
  })
  CATransaction.commit()
}

open override func viewWillDisappear(_ animated: Bool) {
  super.viewWillDisappear(animated)
  CATransaction.begin()
  UIView.animate(withDuration: 0.25, animations: { [weak self] in
    self?.navigationController?.navigationBar.alpha = 1.0
  })
  CATransaction.commit()
}

インタラクティブな却下の間、戻るボタンが透けて見えます。それが私がそれを隠した理由です。


-2

私が試し、完全に機能する非常に単純なソリューションがあります。これはXamarin.iOSにありますが、ネイティブにも適用できます。

    public override void ViewWillAppear(bool animated)
    {
        base.ViewWillAppear(animated);
        this.NavigationController.SetNavigationBarHidden(true, true);
    }

    public override void ViewDidAppear(bool animated)
    {
        base.ViewDidAppear(animated);
        this.NavigationController.SetNavigationBarHidden(false, false);
        this.NavigationController.NavigationBar.Hidden = true;
    }

    public override void ViewWillDisappear(bool animated)
    {
        base.ViewWillDisappear(animated);
        this.NavigationController.SetNavigationBarHidden(true, false);
    }

-6

ユーザーがViewControllerからスライドしたときに、ジェスチャ認識機能を無効にする方法は次のとおりです。viewWillAppear()またはViewDidLoad()メソッドに貼り付けることができます。

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
    self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}

回答を投稿する前に質問をお読みください。問題は、無効にするのではなく、有効にすることでした。私たちはポップジェスチャが大好きです。
Yogesh Maheshwari
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.