Swift: скрытая панель навигации появляется, когда происходит касание - PullRequest
0 голосов
/ 27 декабря 2018

Введение

Я создаю простое приложение, в которое RootViewController встроено в UINavigationController.У меня есть UIView подкласс "landscapeView" с UICollectionView, который заполняет представление.«landscapeView» скрыт в портретной ориентации и отображается в альбомной ориентации устройства.

выпуск

Когда устройство поворачивается в горизонтальную ориентацию, я скрываю панель навигации и табличное представление портрета «rootTableView», покапоказывая "landscapeView".Однако панель навигации появляется, когда я касаюсь экрана в альбомной ориентации.Я не могу понять, как отключить этот кран, чтобы показать вещь.(У меня `navigationController? .HidesBarsOnTap = false, его настройка по умолчанию в раскадровке).

Уточнение: скрытие панели навигации работает отлично в зависимости от ориентации устройства.

Вопрос

Как я могу предотвратить появление панели навигации при нажатии на экран в альбомной ориентации?

Код

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

Спасибо за чтение.

1 Ответ

0 голосов
/ 27 декабря 2018

Проблема в том, что вы установили Hide Bars When Vertically Compact для своего контроллера навигации в раскадровке.Это свойство приводит к такому поведению касания:

Когда значение этого свойства равно true, контроллер навигации скрывает свою панель навигации и панель инструментов при переходе в вертикально компактную среду.По возвращении в вертикально-регулярную среду контроллер навигации автоматически снова показывает обе полосы.Кроме того, необработанные касания в области содержимого приводят к тому, что контроллер навигации снова отображает обе полосы.Значение по умолчанию для этого свойства - false.

Вы можете снять это свойство, поскольку сами позаботились о том, чтобы показывать и скрывать панель навигации в методе viewWillTransition.

...