Lorenzo S
Lorenzo S

Reputation: 73

Hide Navigation bar separator line on iOS 13

I have a view controller with a navigation bar with a large title. When I push the controller, only on iOS 13 is a line visible under the Navigation bar. How can I solve it?

I have already tried several solutions on Stack but they have not worked like:

let navigationBar = navigationController?.navigationBar
let navigationBarAppearence = UINavigationBarAppearance()
navigationBarAppearence.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearence

With this snippet, even if I change the "clear color" with red color it is visible only in the first controller, in the pushed controller it is always gray.

How can I solve it?

Edit

I've solved with:

if #available(iOS 13.0, *) {
    let appearance = UINavigationBarAppearance()
    appearance.shadowColor = nil
    navigationController?.navigationBar.standardAppearance = appearance
 }

Upvotes: 6

Views: 4491

Answers (3)

Mudith Chathuranga Silva
Mudith Chathuranga Silva

Reputation: 7444

I've tried the above-suggested ones and failed to remove the navigation separator line. Eventually, I've figured it out that to use TransparentBackground

The trick is to initialize UINavigationBarAppearance with TransparentBackground. Then you could easily remove the horizontal line of the navigation bar.

let appearance = UINavigationBarAppearance()
appearance.configureWithTransparentBackground()
appearance.backgroundColor = UIColor.green // Required background color

Then add the appearance changes to the navigation item as the apple suggested.

self.navigationItem.standardAppearance = appearance
self.navigationItem.scrollEdgeAppearance = appearance
self.navigationItem.compactAppearance = appearance

Upvotes: 6

Enzo N. Digiano
Enzo N. Digiano

Reputation: 390

import UIKit

public protocol HideableHairlineHelper {
    func hideHairline()
    func showHairline()
}

extension HideableHairlineHelper where Self: UIViewController {

    public func hideHairline() {
        self.navigationController?.navigationBar.shadowImage = UIImage()
        self.navigationController?.toolbar.setShadowImage(UIImage(), forToolbarPosition: .any)
    }

    public func showHairline() {
        self.navigationController?.navigationBar.shadowImage = nil
    }
}

Upvotes: 3

daj mi spokój
daj mi spokój

Reputation: 286

This is my NavBar template I use on my controllers, there's no line.

navigationController?.setNavigationBarHidden(false, animated: false)
    navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    navigationController?.navigationBar.shadowImage = UIImage()
    navigationController?.navigationBar.isTranslucent = true
    let titleAttributes =
        [
            NSAttributedString.Key.font: UIFont.systemFont(ofSize: 18),
            NSAttributedString.Key.foregroundColor: UIColor.red,
    ]
    self.navigationController?.navigationBar.titleTextAttributes = titleAttributes

I obviously change the font size and colour around but that's the basic function I put for each controller to get it clear(translucent).

Upvotes: 0

Related Questions