Ваш вопрос очень интересный. Я никогда не думал о панели навигации.
Когда в качестве корневого контроллера используется UINavigationController
, все UIViewControllers
сохраняются в его стеке, что означает, что все UIViewControllers
совместно используют navigationBar
. Вы добавили mySubView
к navigationBar
в первом UIViewController
. Если вы хотите скрыть его на странице сведений, вы можете выполнить поиск подпредставлений напрямую.
Первый шаг - вам нужно присвоить mySubView
тег, который может быть тегом или может быть пользовательским. type, что удобно для последующего рассмотрения.
На первой странице
import SnapKit
mySubView = UIView()
mySubView?.tag = 999
mySubView?.backgroundColor = .red
mySubView?.translatesAutoresizingMaskIntoConstraints = false
let navBar = navigationController?.navigationBar
navBar!.addSubview(mySubView!)
mySubView!.snp.makeConstraints { (make) in
make.left.equalTo(navBar!).offset(100)
make.centerY.equalTo(navBar!)
make.width.height.equalTo(50)
}
На странице сведений я удалил isHidden
и сохранил navigationBar
с атрибутом, поскольку navigationBar = nil
во время жестаЕсли SnapKit
незнаком, потратьте еще несколько минут на изучение.
var mySubView: UIView? = nil
var navBar: UINavigationBar?
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
// Do any additional setup after loading the view.
navigationController?.interactivePopGestureRecognizer?.addTarget(self, action: #selector(backGesture))
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
homeNavigationBarStatus()
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
homeNavigationBarStatus()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if mySubView == nil {
for view: UIView in (navigationController?.navigationBar.subviews)! {
if view.tag == 999 {
mySubView = view
}
}
}
UIView.animate(withDuration: 1, delay: 0, options: .curveEaseOut, animations: {
self.detailNavigationBarStatus()
}, completion: nil)
}
func detailNavigationBarStatus(){
changingNavigationBarStatus(progress: 0)
}
func homeNavigationBarStatus(){
changingNavigationBarStatus(progress: 1.0)
}
func changingNavigationBarStatus(progress:CGFloat){
mySubView?.alpha = progress
mySubView?.snp.updateConstraints({ (make) in
make.left.equalTo(navBar!).offset(100 * progress)
})
}
@objc func backGesture(sender: UIScreenEdgePanGestureRecognizer) {
switch sender.state {
case .changed:
let x = sender.translation(in: view).x
progress = x / view.frame.width
changingNavigationBarStatus(progress: progress)
default:
break
}
}
Однако использование значений тегов недостаточно элегантно, вы можете создать специальный класс для mySubView
, о котором также можно судитьпо классу.