首页 文章

如何仅在详细视图中隐藏导航栏阴影?

提问于
浏览
0

SO中有许多答案可以提供隐藏导航栏阴影的解决方案 . 除了我在这里描述的这个特殊情况,这些对我有用 . 因此,这个问题不重复 .

为了测试这种特殊情况,我使用master-detail app模板创建了一个新项目 . 在DetailViewController - > viewDidAppear中,我编写了以下代码:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    self.navigationController?.navigationBar.shadowImage = UIImage()

以上代码适用于Single View App和iPad Air 2模拟器 . 但是,它不适用于iPhoneX模拟器中的主从细节应用程序的detailViewController .

或者,我也尝试在viewDidAppear中检索navigationBar的子视图,并尝试隐藏阴影(请参阅下面的代码) . 但是,子视图计数为零 . 怎么会这样?

for parent in self.navigationController!.navigationBar.subviews {
        for childView in parent.subviews {
            if(childView is UIImageView) {
                childView.removeFromSuperview()
            }
        }
    }

对此有任何帮助非常感谢 .

Image of my storyboard

1 回答

  • 1

    对于通用流程

    您可以使用此设置 . 假设 ViewController 是所有其他视图控制器类(您想要阴影的地方), DetailViewController 是详细视图控制器类 .

    我正在做的事情是保留阴影图像 .

    ViewController.swift

    class ViewController: UIViewController {
    
        var shadowImage: UIImage!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
    
             shadowImage = self.navigationController?.navigationBar.shadowImage
        }
    
    
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
    
            self.navigationController?.navigationBar.shadowImage = shadowImage
        }
    
    }
    

    并且 DetailViewController.swift

    class DetailViewController: UIViewController {
    
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
    
            self.navigationController?.navigationBar.shadowImage = UIImage()
        }
    }
    

    Storyboard setup
    enter image description here

    Output

    enter image description here

    Note: 另一种巧妙的方法是将阴影存储在 DetailsViewController 中并在视图即将消失时进行设置

    class DetailsViewController: UIViewController {
    
        var shadowImage: UIImage!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
    
        }
    
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            shadowImage = self.navigationController?.navigationBar.shadowImage
            self.navigationController?.navigationBar.shadowImage = UIImage()
        }
    
        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
            self.navigationController?.navigationBar.shadowImage = shadowImage
        }
    }
    

    这种解决方案更加优雅,可实现清洁管理 .

    对于MasterDetailFlow,使用SplitViewController

    在你的 MasterViewControlelr.swift

    override func viewWillAppear(_ animated: Bool) {
        clearsSelectionOnViewWillAppear = splitViewController!.isCollapsed // placeholder code when you created the project
        super.viewWillAppear(animated)
        self.navigationController?.navigationBar.shadowImage = nil
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        self.navigationController?.navigationBar.shadowImage = UIImage()
    }
    

    在你的 DetailViewController.swift

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.navigationBar.shadowImage = UIImage()
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        self.navigationController?.navigationBar.shadowImage = nil
    }
    

    Output(Master/Detail flow)

    enter image description here

相关问题