大家好,我希望你过得愉快。
我一直试图隐藏UINavigationBar
附带的UINavigationController
一段时间,最后我取得了一些成功,但问题是每次我从UINavigationController
移动到另一个或退出应用程序并返回(而UINavigationBar
隐藏使用我的代码)奇怪的事情发生在UINavigationBar
我将展示我的代码和GIF正在发生的事情。
事情主要发生在
scrollViewDidScroll
UIScrollViewDelegate
方法然后当滚动结束代码时
scrollViewDidEndDragging
会跑
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 }
}
}
}
}
}
}
}