首页 > 解决方案 > Swift:在视图中点击时会出现隐藏的导航栏

问题描述

介绍

我正在创建一个简单的应用程序,其中RootViewController嵌入了UINavigationController. 我有一个UIView子类“landscapeView”,其中有一个UICollectionView填充视图。“landscapeView”以纵向隐藏并以横向设备方向显示。

问题

当设备旋转到横向时,我隐藏了导航栏和纵向表视图“rootTableView”,同时显示“landscapeView”。但是,当我以横向方式点击屏幕时,会出现导航栏。我不知道如何禁用此点击以显示内容。(我有`navigationController?.hidesBarsOnTap = false,它在情节提要中设置为默认值)。

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

问题

横向点击屏幕时,如何防止出现导航栏?

代码

  1. viewWillTransition()在“根视图控制器”中

    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
        }
    }
    

谢谢阅读。

标签: iosswiftuiviewuiviewcontrolleruinavigationcontroller

解决方案


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

当此属性的值为 true 时,导航控制器在转换到垂直紧凑环境时隐藏其导航栏和工具栏。返回垂直规则环境后,导航控制器会自动再次显示两个条形图。此外,内容区域中未处理的点击会导致导航控制器再次显示两个栏。此属性的默认值为 false。

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


推荐阅读