【问题标题】:Swift: Hidden navigation bar appears when tap occurs in viewSwift:在视图中点击时会出现隐藏导航栏
【发布时间】:2019-05-25 11:07:19
【问题描述】:

简介

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

问题

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

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

问题

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

代码

  1. “RootViewController”中的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
        }
    }
    

感谢阅读。

【问题讨论】:

  • 试试这个!! lanscapeView.isUserInteractionEnabled = false
  • @AbhishekJadhav 感谢您的评论。这将删除“landscapeView”中UICollectionView 的手势,但是当我点击 LandscapeView 时,navigationController 仍然出现。
  • 现在要隐藏导航栏吗?
  • @AbhishekJadhav 是的,我想在设备处于横向时隐藏导航栏,效果很好。但是,如果我在横向时点击屏幕,则会出现导航栏。
  • 检查断点可能是你改变导航栏隐藏的标志为假吗?或者当您点击屏幕时您的 isLandscape 标志会发生变化?

标签: ios swift uiview uiviewcontroller uinavigationcontroller


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答。但是它没有解决“点击时显示”问题,导航栏仍然出现在点击时。 hidesBarsOnTap 不会阻止导航栏在点击时出现,它似乎只会影响导航栏的关闭。这对你有用吗?
  • 我创建了一个简单的演示项目并将其上传到 GitHub,从而说明了问题。请参阅我的问题中的编辑以获取链接。
  • @theoadahl 更新了我的答案。
  • 很高兴我能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
相关资源
最近更新 更多