анимировать подпредставления внутри UINavigationBar при нажатии на detailviewController - PullRequest
0 голосов
/ 17 октября 2019

У меня есть несколько подпредставлений в панели навигации. Черный квадрат, несколько названий и синяя полоса. При перемещении в детальный viewController я хочу, чтобы мои подпредставления скрывались (анимированные). Я добавил метрополитен на панель навигации внутри контроллера основного вида, используя self.navigationController?.navigationBar.addsubView(mySubview).

В настоящее время это выглядит так:

navigationbar

Как правильно скрыть (анимировать) эти подпредставления в подробном viewController?

1 Ответ

1 голос
/ 18 октября 2019

Ваш вопрос очень интересный. Я никогда не думал о панели навигации.

Когда в качестве корневого контроллера используется 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, о котором также можно судитьпо классу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...