Swift: 在视图中点击时出现隐藏的导航栏

Swift: Hidden navigation bar appears when tap occurs in view

简介

我正在创建一个简单的应用程序,其中 RootViewController 嵌入了 UINavigationController。我有一个 UIView 子类 "landscapeView",里面有一个 UICollectionView 来填充视图。 "landscapeView" 纵向隐藏,横向显示。

问题

当设备旋转到横向时,我隐藏导航栏和纵向 table 视图 "rootTableView",同时显示 "landscapeView"。但是,当我以横向点击屏幕时,会出现 navigationBar。我不知道如何禁用此水龙头来显示东西。 (我有`navigationController?.hidesBarsOnTap = false,它在故事板中设置为默认值)。

澄清:隐藏导航栏效果完全取决于设备方向。

问题

如何防止横向点击屏幕时出现navigationBar?

代码

  1. viewWillTransition() 在 "RootViewController"

    private let landscapeView = LandscapeView(frame: .zero)
    private let rootTableView = UITableView(frame: .zero, style: .grouped)
    
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)   
    
        var isLandscape = true
        switch UIDevice.current.orientation {
        case .landscapeLeft:
            navigationController?.navigationItem.searchController?.accessibilityElementsHidden = true
    
            isLandscape = true
        case .landscapeRight:
    
            navigationController?.navigationItem.searchController?.accessibilityElementsHidden = true
    
            isLandscape = true
        case .portrait, .portraitUpsideDown, .faceUp, .faceDown, .unknown:
    
            isLandscape = false
          navigationController?.navigationItem.searchController?.accessibilityElementsHidden = false
    
        default:
            break
        }
    
        if isLandscape {
            navigationController?.setNavigationBarHidden(true, animated: false)
            self.landscapeView.isHidden = false
    
            // This simply tells the "landscapeView" to layoutSubviews() and reloadData() for the collectionView within.
            landscapeViewDelegate?.landscapeViewWillAppear(inDarkMode: inDarkMode)
        }
        UIView.animate(withDuration: 0.6, delay: 0, options: .layoutSubviews, animations: {
            // This is a tableView displayed in portrait mode.
            self.rootTableView.alpha = isLandscape ? 0 : 1 
            self.landscapeView.alpha = isLandscape ? 1 : 0
        }) { (success) in
            if isLandscape == false {
                self.landscapeView.isHidden = true
                 self.navigationController?.setNavigationBarHidden(false, animated: true)
            }
            return
        }
    }
    

感谢阅读。

问题是您在情节提要中检查了 Hide Bars When Vertically Compact 导航控制器。 属性 带来了点击行为:

When the value of this property is true, the navigation controller hides its navigation bar and toolbar when it transitions to a vertically compact environment. Upon returning to a vertically regular environment, the navigation controller automatically shows both bars again. In addition, unhandled taps in the content area cause the navigation controller to show both bars again. The default value of this property is false.

您可以取消选中 属性,因为您自己负责在 viewWillTransition 方法中显示和隐藏导航栏。