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

Ios 如何在Swift中向导航栏添加阴影并隐藏边框?,ios,swift,Ios,Swift,我目前正在使用以下代码向导航栏添加阴影: self.navigationController?.navigationBar.layer.shadowColor=UIColor.black.cgColor self.navigationController?.navigationBar.layer.shadowOffset=CGSize(宽度:0.0,高度:4.0) self.navigationController?.navigationBar.layer.shadowRadius=4.0 se

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

self.navigationController?.navigationBar.layer.shadowColor=UIColor.black.cgColor
self.navigationController?.navigationBar.layer.shadowOffset=CGSize(宽度:0.0,高度:4.0)
self.navigationController?.navigationBar.layer.shadowRadius=4.0
self.navigationController?.navigationBar.layer.shadowOpacity=0.3
self.navigationController?.navigationBar.layer.masksToBounds=false
这将产生以下结果: 阴影显示正确,但我不希望显示导航栏的1px黑色边框,我只希望导航栏有阴影。我知道将导航栏的shadow属性设置为空图像会删除边框,但这也会隐藏阴影。有没有办法实现没有边框的阴影?

添加此扩展:

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
  }
}  
如果要查看行是否消失,请注释导航栏阴影并将“表视图分隔符颜色”设置为“清除…”

//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
添加此扩展名:

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
  }
}  
如果要查看行是否消失,请注释导航栏阴影并将“表视图分隔符颜色”设置为“清除…”

//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

检查。这会隐藏阴影和边框。我正在寻找一种无边框显示阴影的方法。嗯,我想既然你正在更改图像而不是阴影属性,那就行了!My Bad如果以这种方式隐藏阴影会怎么样:
navigationController?.navigationBar.setValue(true,forKey:“hidesShadow”)
Check。这会隐藏阴影和边框。我正在寻找一种无边框显示阴影的方法。嗯,我想既然你正在更改图像而不是阴影属性,那就行了!我的坏处如果你这样隐藏阴影会怎么样:
navigationController?.navigationBar.setValue(true,forKey:“hidesShadow”)
对于第二部分,我得到了错误“类型为'UINavigationBar'的值没有成员'hairlineImageView'。嗨,我刚刚再次检查,仍然存在相同的错误。导航栏下没有hairlineImageView属性。另外,我正试图显示一个阴影,但只是一个阴影,现在我的代码显示阴影,但下面有1px行。@TOPCOD3R你是对的,我忘了添加扩展名。。。我更新了我的答案,对不起…谢谢你的回答,但这只是隐藏了1px行。现在有没有办法添加阴影?我想要一个阴影,但如果可能的话,没有线条。@TOPCOD3R取消对阴影的注释。。。第二部分仅用于显示行已消失…第二部分,我收到错误“类型为'UINavigationBar'的值没有成员'hairlineImageView'”。您好,我刚刚再次检查,仍然存在相同的错误。导航栏下没有hairlineImageView属性。另外,我正试图显示一个阴影,但只是一个阴影,现在我的代码显示阴影,但下面有1px行。@TOPCOD3R你是对的,我忘了添加扩展名。。。我更新了我的答案,对不起…谢谢你的回答,但这只是隐藏了1px行。现在有没有办法添加阴影?我想要一个阴影,但如果可能的话,没有线条。@TOPCOD3R取消对阴影的注释。。。第二部分只是为了表明这条线已经走了。。。