Ios Swift:在视图中点击时显示隐藏的导航栏 介绍

Ios Swift:在视图中点击时显示隐藏的导航栏 介绍,ios,swift,uiview,uiviewcontroller,uinavigationcontroller,Ios,Swift,Uiview,Uiviewcontroller,Uinavigationcontroller,我正在中创建一个简单的应用程序,其中RootViewController嵌入在UINavigationController中。我有一个UIView子类“landscapeView”,其中有一个UICollectionView填充视图。“景观视图”隐藏在纵向中,并以横向设备方向显示 问题 当设备旋转到横向时,我隐藏导航栏和纵向表格视图“rootTableView”,同时显示“landscapeView”。但是,当我以横向方向轻触屏幕时,导航栏会出现。我想不出如何禁用这个水龙头来显示东西。(我有'n

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

问题 当设备旋转到横向时,我隐藏导航栏和纵向表格视图“rootTableView”,同时显示“landscapeView”。但是,当我以横向方向轻触屏幕时,导航栏会出现。我想不出如何禁用这个水龙头来显示东西。(我有'navigationController?.hidesBarsOnTap=false,其设置在情节提要中为默认设置)

说明:隐藏导航栏的效果取决于设备的方向

问题: 当屏幕以横向方向点击时,如何防止导航栏出现

代码
  • “RootViewController”中的
    viewWillTransition()


  • 感谢阅读。

    问题是您在序列图像板中为导航控制器选中了垂直压缩时隐藏栏。此属性带来了该点击行为:

    当此属性的值为true时,导航控制器 当它转换到某个位置时隐藏其导航栏和工具栏 垂直紧凑的环境。当返回到垂直规则时 环境中,导航控制器会自动显示两个栏 再一次。此外,内容区域中未经处理的点击会导致 导航控制器再次显示两个栏。的默认值 这个属性是假的


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

    试试这个!!lanscapeView.isUserInteractionEnabled=false@AbhishekJadhav谢谢你的评论。这将删除“landscapeView”中的
    UICollectionView
    的手势,但是当我点击landscapeView时,navigationController仍会出现。现在你想隐藏导航栏吗?@AbhishekJadhav是的,当设备处于横向时,我想隐藏导航栏,这非常有效。但是,如果我在横向方向点击屏幕,导航栏就会出现。用断点检查是否更改导航栏隐藏的标志为false?或者当你点击屏幕时,你的isLandscape标志改变了?谢谢你的回答。但是,它没有解决“点击时显示”问题,导航栏仍会在点击时显示。
    hidesBarsOnTap
    不会阻止导航栏在点击时出现,它似乎只会影响导航栏的取消。这对你有用吗?我创建了一个简单的演示项目,并将其上传到GitHub,这说明了这个问题。请查看我问题中的编辑链接。@theoadahl更新了我的答案。很高兴我能提供帮助。
    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
        }
    }