Tong
Tong

Reputation: 1000

UISearchController in navigation bar could not hide properly on iOS 11

I want to hide navigation bar after a tap

navigationController?.hidesBarsOnTap = true

The navigationBar hides properly after a tap hide Navigation Bar

But after adding a searchController (code below)

let searchController = UISearchController(searchResultsController: nil)
navigationItem.searchController = searchController

My view (cyan color) could not extend correctly

not properly

And I also tried rotated it. The search bar appears.

enter image description here

Upvotes: 1

Views: 657

Answers (1)

Tong
Tong

Reputation: 1000

Finally found a solution

override func viewDidLoad() {
    super.viewDidLoad()

    navigationController?.barHideOnTapGestureRecognizer.addTarget(self, action: #selector(barHideAction(_:)))
    let searchController = UISearchController(searchResultsController: nil)
    navigationItem.searchController = searchController
    navigationItem.hidesSearchBarWhenScrolling = false
    navigationController?.hidesBarsOnTap = true
}

@objc func barHideAction(_ guesture: UITapGestureRecognizer) {
    updateFrame()
}

func updateFrame() {
    if let nc = navigationController {
        let isHidden = nc.isNavigationBarHidden
        searchController.searchBar.superview?.isHidden = isHidden

        if isHidden {
            self.additionalSafeAreaInsets.top = -64 // fixed by a magic num
        }
        else {
            self.additionalSafeAreaInsets.top = 0
        }
    }
}

example code

Upvotes: 0

Related Questions