ios - 如何仅在详细 View 中隐藏导航栏阴影?

标签 ios swift uinavigationbar uisplitviewcontroller

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

为了测试这个特殊案例,我使用主从应用程序模板创建了一个新项目。在 DetailViewController -> viewDidAppear 中,我编写了以下代码:

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

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

或者,我还尝试在 viewDidAppear 中检索 navigationBar 的 subview 并尝试隐藏阴影(参见下面的代码)。但是, subview 计数为零。怎么可能?

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

非常感谢对此的任何帮助。

Image of my storyboard

最佳答案

对于通用流程

您可以使用此设置。说 ViewController 是所有其他 View Controller 类(你想要阴影的地方),DetailViewController 是详细 View Controller 类。

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

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设置 enter image description here

输出

enter image description here

注意:另一种巧妙的方法是将阴影存储在 DetailsViewController 中,并在 View 即将消失时设置它

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
}

输出(主/明细流)

enter image description here

关于ios - 如何仅在详细 View 中隐藏导航栏阴影?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53361601/

相关文章:

iphone - 如何向导航栏添加项目

ios - UIStackView 里面的 UIScrollView 位置

ios - 如何更改 uipagecontrol 点的数量和每个点之间的间距

swift - 编译器的这个响应有效吗?

ios - 如何使用 firebase 获取设备 token ?

objective-c - 单击UINavigationBar按钮时的光泽效果

javascript - 从 UIWebView Javascript 监听 Objective-C 中的通知

ios - 构建成功后,应用程序启动没有返回有效的对,也没有在 Xcode 上返回启动错误

swift - 将具有 "posted"帖子的用户个人资料图像加载到 TableView 上

ios - 将图像添加到 navigationItem 的标题