Привет, ребята. Надеюсь, у вас хороший день.
Я уже некоторое время пытаюсь скрыть 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 }
}
}
}
}
}
}
}