Невозможно правильно спрятать в UINavigationBar - PullRequest
0 голосов
/ 29 апреля 2019

Привет, ребята. Надеюсь, у вас хороший день.

Я уже некоторое время пытаюсь скрыть UINavigationBar, который идет с UINavigationController, и наконец я добился определенного успеха, но проблема заключается в каждомКогда я перехожу из UINavigationController в другое или покидаю приложение и возвращаюсь (в то время как UINavigationBar скрывается с помощью моего кода), с UINavigationBar происходят странные вещи. Я продемонстрирую свой код и GIF из происходящего.

В основном это происходит в

scrollViewDidScroll

UIScrollViewDelegate метод Затем, когда свиток заканчивает код в

scrollViewDidEndDragging

будет запускаться

Нормальное поведение behavior После возврата в приложение after switching views or exiting app

extension GDMainViewController: UIScrollViewDelegate {

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {

    if urlField.isFirstResponder {
        urlField.resignFirstResponder()
    }

    let scrollOffset = scrollView.contentOffset.y

    if webScrollLastYAxis == nil {
        webScrollLastYAxis = scrollOffset
    }
}

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {

    let scrollOffset = scrollView.contentOffset.y

    if !decelerate {

        guard let navigationBar = navigationController?.navigationBar else {
            return
        }

        let navOffset = navigationBar.frame.origin.y
        let navViews = navigationBar.subviews[2].subviews


        UIView.animate(withDuration: 0.5) {
            if navOffset < -10 {
                navigationBar.frame.origin.y = self.statusBarFrame
                for view in navViews {
                    view.alpha = 0.0
                }
                self.webScrollIsHidingViews = true
            } else {
                navigationBar.frame.origin.y = 20
                for view in navViews {
                    view.alpha = 1.0
                }
                self.webScrollIsHidingViews = false
            }
        }
    }

    webScrollLastYAxis = scrollOffset
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {

    guard let navigationBar = navigationController?.navigationBar else {
        return
    }
    guard let oldScrollOffset = webScrollLastYAxis else {
        return
    }
    let scrollOffset = scrollView.contentOffset.y
    let navOffset = navigationBar.frame.origin.y
    let navViews = navigationBar.subviews[2].subviews

    if oldScrollOffset > scrollOffset {
        //print("downwards")
        if navOffset < 21 && navOffset >= statusBarFrame {
            if navOffset != 20 {
                UIView.animate(withDuration: 0.1) {
                    navigationBar.frame.origin.y += 1
                    for view in navViews {
                        let newAlpha = view.alpha + 0.04
                        if newAlpha > 1 { view.alpha = 1.0
                        } else { view.alpha = newAlpha }
                    }
                }
            }
        }
    } else {
        //print("upwards")
        if scrollOffset > 0 {
            if navOffset < 21 && navOffset >= statusBarFrame {
                if navOffset != statusBarFrame {
                    UIView.animate(withDuration: 0.1) {
                        navigationBar.frame.origin.y -= 1
                        for view in navViews {
                            let newAlpha = view.alpha - 0.02
                            if newAlpha < 0 { view.alpha = 0.0
                            } else { view.alpha = newAlpha }
                        }
                    }
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 29 апреля 2019

Может помочь это-

override func viewWillAppear(_ animated: Bool) {
     self.navigationController?.setNavigationBarHidden(false, animated: true)
     searchBar.isHidden = false

}
...