gpt4 book ai didi

ios - 当推送到详细 View Controller 时,对 UINavigationBar 内的 subview 进行动画处理

转载 作者:行者123 更新时间:2023-11-28 23:26:46 25 4
gpt4 key购买 nike

我的导航栏中有一些 subview 。一个黑色方 block 、一些标题和一个蓝色条。当推送到详细 View Controller 时,我希望我的 subview 隐藏(动画)。我使用以下命令将地铁添加到主视图 Controller 内的导航栏self.navigationController?.navigationBar.addsubView(mySubview)

目前,它看起来像他的:

navigationbar

在详细 View Controller 中隐藏(动画)这些 subview 的正确方法是什么?

最佳答案

你的问题很有趣。我从来没有想过导航栏。

UINavigationController用作根 Controller ,全部UIViewControllers都存储在它的堆栈中,这意味着所有 UIViewControllers分享一个navigationBar .您添加了 mySubViewnavigationBar在第一UIViewController .如果想在详情页隐藏,可以直接搜索 subview 。

第一步,你需要给出 mySubView a tag,可以是标签,也可以是自定义类型,方便后期判断。

在第一页

   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创建一个特定的类, 也可以按类来判断。

关于ios - 当推送到详细 View Controller 时,对 UINavigationBar 内的 subview 进行动画处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58435025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com