当推送到detailviewController时,UINavigationBar内的动画子视图

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

我的NavigationBar中有一些子视图。黑色正方形,一些标题和蓝色条。当推送到详细信息viewController时,我希望子视图隐藏(动画)。我使用以下命令将地铁添加到了主视图控制器内的导航栏中self.navigationController?.navigationBar.addsubView(mySubview)

当前,看起来像他的:

navigationbar

在详细信息viewController中隐藏(动画化)那些子视图的正确方法是什么?

ios uiviewcontroller uinavigationbar uiviewanimation
1个回答
1
投票

您的问题非常有趣。我从没想过导航栏。

[将UINavigationController用作根控制器时,所有UIViewControllers都存储在其堆栈中,这意味着所有UIViewControllers共享一个navigationBar。您在第一个mySubView中将navigationBar添加到了UIViewController。如果要在详细信息页面上将其隐藏,则可以直接搜索子视图。

第一步,需要给mySubView一个标签,它可以是标签,也可以是自定义类型,方便以后进行判断。

在第一页上

   mySubview = UIView.init(frame: CGRect(x: 0, y: 0, width: 100, height: 50))
   mySubview?.tag = 999

   navigationController?.navigationBar.addSubview(mySubview!)

在详细信息页面上

   var mySubView: UIView? = nil

   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 viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        for view: UIView in (navigationController?.navigationBar.subviews)! {
            if view.tag == 999 {
                mySubView = view

                UIView.animate(withDuration: 1, delay: 0, options: .curveEaseOut, animations: {
                    view.alpha = 0.0
                }){ (completion) in
                    view.isHidden = true
                }
            }
        }
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        self.mySubView?.alpha = 1.0
        self.mySubView?.isHidden = false
    }

    @objc func backGesture(sender: UIScreenEdgePanGestureRecognizer) {
        self.mySubView?.isHidden = false
        switch sender.state {
        case .changed:
            let x = sender.translation(in: view).x
            let progress =  x / view.frame.width
            mySubView?.alpha = progress
        default:
            UIView.animate(withDuration: 0.4) {
                self.mySubView?.alpha = 1
            }
        }
    }

但是,使用标记值还不够优雅,您可以为mySubView创建一个特定的类,也可以通过类来判断。

© www.soinside.com 2019 - 2024. All rights reserved.