我的NavigationBar中有一些子视图。黑色正方形,一些标题和蓝色条。当推送到详细信息viewController时,我希望子视图隐藏(动画)。我使用以下命令将地铁添加到了主视图控制器内的导航栏中self.navigationController?.navigationBar.addsubView(mySubview)
。
当前,看起来像他的:
在详细信息viewController中隐藏(动画化)那些子视图的正确方法是什么?
您的问题非常有趣。我从没想过导航栏。
[将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
创建一个特定的类,也可以通过类来判断。