无法正确隐藏到UINavigationBar

问题描述 投票:0回答:1

大家好,我希望你过得愉快。

我一直试图隐藏UINavigationBar附带的UINavigationController一段时间,最后我取得了一些成功,但问题是每次我从UINavigationController移动到另一个或退出应用程序并返回(而UINavigationBar隐藏使用我的代码)奇怪的事情发生在UINavigationBar我将展示我的代码和GIF正在发生的事情。

事情主要发生在

scrollViewDidScroll

UIScrollViewDelegate方法然后当滚动结束代码时

scrollViewDidEndDragging

会跑

正常行为behavior返回App 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 }
                        }
                    }
                }
            }
        }
    }
}
swift uiscrollview uinavigationbar
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.