如何使用UISearchController删除UINavigationBar下面的阴影

时间:2018-01-08 11:47:33

标签: ios swift

Image 1

我可以使用以下代码行成功删除导航栏下方的阴影。

self.navigationController?.navigationBar.shadowImage = UIImage()

Image 2

但是当我添加搜索控制器时,阴影再次出现。

self.navigationItem.searchController = UISearchController(searchResultsController: nil)

Image 3

我尝试了以下操作,但导致了意外行为。

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.barTintColor = .white
self.navigationController?.navigationBar.isTranslucent = false

Image 4

如果连接了搜索控制器,如何删除导航栏下的阴影?

4 个答案:

答案 0 :(得分:2)

我也没有找到好的解决方案...

现在我将以这种方式隐藏它:

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if let imageView = navigationItem.searchController?.searchBar.superview?.subviews.first?.subviews.first as? UIImageView {
            imageView.isHidden = true
        }
    }

答案 1 :(得分:1)

这是我使用的解决方案

  1. 创建一个扩展UINavigationController实例的单独类,将其称为BaseNavigationController。这是您的课程

  2. 如果使用情节提要,请为情节提要中的UINavigationController场景分配BaseNavigationController

  3. 如果您通过代码初始化导航控制器,例如:UINavigationController.init(rootViewController: someViewControllerInstance),然后只需使用BaseNavigationController.init(rootViewController: someViewControllerInstance)

该类的示例如下所示:

open class BaseNavigationController:UINavigationController {

    override open func viewDidLoad() {
        super.viewDidLoad()
        setNavigationBar()
        setNavBarBorder(false)
    }

    func setNavigationBar(color:UIColor?=UIColor.white, tint:UIColor?=UIColor.darkGray){
        let appearance = UIBarButtonItem.appearance()
        appearance.setBackButtonTitlePositionAdjustment(UIOffset.init(horizontal: 0.0, vertical: 0), for: .default)
        self.navigationBar.barTintColor = color!
        self.navigationBar.isTranslucent = false
        self.navigationBar.tintColor = tint!
        self.navigationBar.titleTextAttributes = [ NSAttributedString.Key.foregroundColor: tint! ]
    }

    func setTitleColor(_ color:UIColor?=UIColor.darkGray){

    }

    func setNavBarBorder(_ enable:Bool) {
        self.navigationBar.setBackgroundImage((enable ? nil : UIImage()), for: UIBarMetrics.default)
        self.navigationBar.shadowImage = (enable ? nil : UIImage())
        self.navigationBar.setValue(true, forKey: "hidesShadow")
    }

}

现在,有趣的部分是,如果您要处理不明确的布局,则可能需要在viewWillLayoutSubviews中执行此操作,否则请将这段代码放入viewWillAppear中 的viewController实例。

(self.navigationController as? BaseNavigationController)?. setNavBarBorder(false)

对于某些版本的iOS,有趣的代码位于self.navigationBar.setValue(true, forKey: "hidesShadow")中。

答案 2 :(得分:0)

您可以将searchBar添加到storyBoard中的viewController,并将其 搜索样式 属性设置为Minimal,它看起来像这个:

enter image description here

答案 3 :(得分:0)

我对此问题的贡献不大。当然,这不是正确的方法,但是它适用于不透明的导航栏。这个想法是在阴影的顶部添加一个视图。

let searchBar = searchController.searchBar
let maskView = UIView(frame: .zero)
maskView.backgroundColor = .white // or any color you want
searchBar.addSubview(maskView)

//We need to use constraint so the mask view follow the search bar animation
maskView.translatesAutoresizingMaskIntoConstraints = false
let views = ["maskView": maskView]
searchBar.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-(0)-[maskView]-(0)-|",
                                                        options: NSLayoutConstraint.FormatOptions.alignAllCenterY,
                                                        metrics: nil,
                                                        views: views))
searchBar.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[maskView(1)]-(-1)-|",
                                                        options: NSLayoutConstraint.FormatOptions.alignAllCenterX,
                                                        metrics: nil,
                                                        views: views))