如何在 Swift 中为导航栏添加阴影并隐藏边框?

Posted

技术标签:

【中文标题】如何在 Swift 中为导航栏添加阴影并隐藏边框?【英文标题】:How to add shadow to navigation bar and hide border in Swift? 【发布时间】:2020-09-18 11:00:43 【问题描述】:

我目前正在使用以下代码向导航栏添加阴影:

self.navigationController?.navigationBar.layer.shadowColor = UIColor.black.cgColor
self.navigationController?.navigationBar.layer.shadowOffset = CGSize(width: 0.0, height: 4.0)
self.navigationController?.navigationBar.layer.shadowRadius = 4.0
self.navigationController?.navigationBar.layer.shadowOpacity = 0.3
self.navigationController?.navigationBar.layer.masksToBounds = false

这会产生以下结果: 阴影显示正确,但是我不希望显示导航栏的 1px 黑色边框,我只希望导航栏有阴影。我知道将导航栏的阴影属性设置为空图像会删除边框,但这也会隐藏阴影。有没有办法实现无边框阴影?

【问题讨论】:

检查this answer。 这会隐藏阴影和边框。我正在寻找一种显示无边框阴影的方法。 嗯,我想既然你改变的是图像而不是阴影属性,那就行了!我的坏 如果你这样隐藏阴影会怎样:navigationController?.navigationBar.setValue(true, forKey: "hidesShadow") 【参考方案1】:

添加这个扩展:

extension UIView 
fileprivate var hairlineImageView: UIImageView? 
    return hairlineImageView(in: self)


fileprivate func hairlineImageView(in view: UIView) -> UIImageView? 
    if let imageView = view as? UIImageView, imageView.bounds.height <= 1.0 
        return imageView
    

    for subview in view.subviews 
        if let imageView = self.hairlineImageView(in: subview)  return imageView 
    
    return nil
  
  

在 viewWillAppear 中的导航栏阴影后添加此行:

navigationController?.navigationBar.hairlineImageView?.isHidden = true

如果您想看到这条线已消失,请评论导航栏阴影并将表格视图分隔符颜色设置为清除...

//navigationController?.navigationBar.layer.shadowColor = UIColor.black.cgColor
//navigationController?.navigationBar.layer.shadowOffset = CGSize(width: 0.0, height: 4.0)
//navigationController?.navigationBar.layer.shadowRadius = 4.0
//navigationController?.navigationBar.layer.shadowOpacity = 0.3
//navigationController?.navigationBar.layer.masksToBounds = false
    
navigationController?.navigationBar.hairlineImageView?.isHidden = true
tableView.separatorColor = .clear

【讨论】:

对于第二部分,我收到错误“'UINavigationBar' 类型的值没有成员'hairlineImageView'”。 你好,我刚刚又检查了一遍,还是一样的错误。 navigationBar 下没有 hairlineImageView 属性。另外,我试图显示一个阴影,但只有一个阴影,现在我有阴影显示的代码,但下面有 1px 线。 @TOPCOD3R 你说得对,我忘了输入扩展名...我更新了我的答案,对不起... 感谢您的回答,但这只是隐藏了 1px 行。现在有什么方法可以添加阴影吗?如果可能的话,我想要一个阴影,但没有线条。 @TOPCOD3R 取消注释你的影子……第二部分只是为了表明这条线已经消失了……

以上是关于如何在 Swift 中为导航栏添加阴影并隐藏边框?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 react-native IOS 中隐藏或删除阴影或底部边框

如何在 Swift 中立即隐藏导航栏?

如何在Swift中立即隐藏导航栏?

如何使用 Xcode 和 Swift 在我的导航栏中添加标题?

白色背景的 Div 隐藏了 Bootstrap 导航栏阴影

如何在 Swift 中隐藏第一个 ViewController 的导航栏?