2
votes

So I'm looking for how can I add shadow to NavigationBar and remove the bottom black line from NavigationBar? Also if I have searchBar in NavigationBar then shadow should go below to search bar. I want to make a change globally without making a change in every viewController.

https://imgur.com/a/8ogGRaf.jpg

So I already archive these changes except add a shadow below to search controller.

  1. For Shadow:

    self.navigationController?.navigationBar.isTranslucent = false
    self.navigationController?.navigationBar.layer.shadowColor = UIColor.black.cgColor
    self.navigationController?.navigationBar.layer.shadowOffset = CGSize(width: 0.0, height: 0.0)
    self.navigationController?.navigationBar.layer.shadowRadius = 7.0
    self.navigationController?.navigationBar.layer.shadowOpacity = 0.2
    
  2. For Remove a Bottom Bar:

    UINavigationBar.appearance().backIndicatorImage = UIImage(named:"normal")
    UINavigationBar.appearance().backIndicatorTransitionMaskImage = UIImage(named:"normal")
    

This is What issue I'm getting with search Bar

https://imgur.com/a/QQ9yrbE

1
you are adding shadows to navigation bar when you should add them below search bar - Lu_
You mean to like create new UIView with shadow and just add that below navigationBar? - jay patel

1 Answers

1
votes

2.hide bottom line

public extension UINavigationBar {

    /// Hide line under navigation bar
    public func hideBottomHairline() {
        let navigationBarImageView = hairlineImageViewInNavigationBar(self)
        navigationBarImageView!.isHidden = true
    }

    ///  Show line under navigation bar
    public func showBottomHairline() {
        let navigationBarImageView = hairlineImageViewInNavigationBar(self)
        navigationBarImageView!.isHidden = false
    }

    fileprivate func hairlineImageViewInNavigationBar(_ view: UIView) -> UIImageView? {
        if view.isKind(of: UIImageView.self) && view.bounds.height <= 1.0 {
            return (view as! UIImageView)
        }
        let subviews = (view.subviews as [UIView])
        for subview: UIView in subviews {
            if let imageView: UIImageView = hairlineImageViewInNavigationBar(subview) {
                return imageView
            }
        }
        return nil
    }   
}