在swift中删除navigationBar中的边框

Pet*_*Pik 105 iphone uinavigationbar ios swift

我一直试图删除navigationBars边框没有运气.我已经研究过,人们似乎告诉将shadowImage和BackgroundImage设置为nil,但这在我的情况下不起作用.

我的代码

    self.navigationController?.navigationBar.barTintColor = UIColor(rgba: "#4a5866")
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: ""), forBarMetrics: UIBarMetrics.Default)
    self.navigationController?.navigationBar.shadowImage = UIImage(named: "")
Run Code Online (Sandbox Code Playgroud)

插图:

在此输入图像描述

Nat*_*ook 269

麻烦在于这两行:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: ""), forBarMetrics: UIBarMetrics.Default)
self.navigationController?.navigationBar.shadowImage = UIImage(named: "")
Run Code Online (Sandbox Code Playgroud)

由于您没有没有名称的图像,因此UIImage(named: "")返回nil,这意味着默认行为将起作用:

当非零时,显示自定义阴影图像而不是默认阴影图像.要显示自定义阴影,还必须使用-setBackgroundImage设置自定义背景图像:forBarMetrics :(如果使用默认背景图像,将使用默认阴影图像).

你需要一个真正的空图像,所以只需初始化UIImage():

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
Run Code Online (Sandbox Code Playgroud)

  • 此方法与iOS 11中的大标题冲突 (4认同)
  • 这个答案确实有效.因为如果使用接受的答案(代码),则删除工具栏中的imageViews. (2认同)

Ste*_*yne 37

这将完全删除阴影图像

for parent in self.navigationController!.navigationBar.subviews {
 for childView in parent.subviews {
     if(childView is UIImageView) {
         childView.removeFromSuperview()
     }
 }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一对我有用的答案.谢谢! (2认同)
  • 神圣的女强人!经过所有搜索,这是唯一有效的方法。 (2认同)

Saz*_*han 35

斯威夫特4

删除边框:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for:.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.layoutIfNeeded()
Run Code Online (Sandbox Code Playgroud)

恢复边界:

self.navigationController?.navigationBar.setBackgroundImage(nil, for:.default)
self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.layoutIfNeeded()
Run Code Online (Sandbox Code Playgroud)

  • 完美的答案:) (2认同)

Jor*_*ego 34

使用Swift 2,你可以这样做:

AppDelegate文件

内部func应用程序(...,didFinishLaunchingWithOptions launchOptions:...)

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)
Run Code Online (Sandbox Code Playgroud)

对于Swift 3:

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
Run Code Online (Sandbox Code Playgroud)


Gau*_*ana 31

只需在UINavigationBar的扩展中写下这个

extension UINavigationBar {

    func shouldRemoveShadow(_ value: Bool) -> Void {
        if value {
            self.setValue(true, forKey: "hidesShadow")
        } else {
            self.setValue(false, forKey: "hidesShadow")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的viewController ..

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.shouldRemoveShadow(true)        
}
Run Code Online (Sandbox Code Playgroud)

为了解决任何viewController的问题,只需传递'false'即可.

  • 这是一个很好的答案!我添加了一个简化代码的答案. (2认同)

Dre*_*rew 17

对于 iOS 13+:

let appearance = UINavigationBarAppearance()
appearance.shadowColor = .clear
Run Code Online (Sandbox Code Playgroud)

将此外观分配给UINavigationBar

navigationController?.navigationBar.standardAppearance = appearance
navigationController?.navigationBar.scrollEdgeAppearance = appearance
navigationController?.navigationBar.compactAppearance = appearance
Run Code Online (Sandbox Code Playgroud)

设置shadowImage = UIImage()对我来说不起作用。

  • 是的,这是 iOS 13.0+ 的正确答案 (2认同)

小智 16

斯威夫特 5

使用 setBackgroundImage / shadowImage 隐藏发际线时,会有一点延迟。这种方法消除了延迟。感谢变色龙框架。这是他们使用的方法(在 ObjC 中)


extension UINavigationController {
    func hideHairline() {
        if let hairline = findHairlineImageViewUnder(navigationBar) {
            hairline.isHidden = true
        }
    }
    func restoreHairline() {
        if let hairline = findHairlineImageViewUnder(navigationBar) {
            hairline.isHidden = false
        }
    }
    func findHairlineImageViewUnder(_ view: UIView) -> UIImageView? {
        if view is UIImageView && view.bounds.size.height <= 1.0 {
            return view as? UIImageView
        }
        for subview in view.subviews {
            if let imageView = self.findHairlineImageViewUnder(subview) {
                return imageView
            }
        }
        return nil
    }
}

Run Code Online (Sandbox Code Playgroud)

  • FWIW,这是在 iOS 13.4 上唯一对我有用的解决方案...... (2认同)
  • 这应该标记为正确答案。 (2认同)

gpb*_*pbl 13

设置barStyle.Black设置色调之前:

self.navigationController?.navigationBar.translucent = false
self.navigationController?.navigationBar.barStyle = .Black
self.navigationController?.navigationBar.barTintColor = UIColor.blueColor()
Run Code Online (Sandbox Code Playgroud)


Dav*_*aez 9

Luca Davanzo的答案很棒,但它在iOS 10中不起作用.我将其改为iOS 10及以下版本.

for parent in navigationController!.view.subviews {
    for child in parent.subviews {
        for view in child.subviews { 
            if view is UIImageView && view.frame.height == 0.5 {
                view.alpha = 0
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以扩展UINavigationController并将其调用.removeFromSuperview()在线上将不能在iOS 10上工作,所以我只是将alpha设置为0,所以这一个调用在任何地方都兼容.


Jos*_*llo 8

let navBarAppearance = UINavigationBarAppearance()
navBarAppearance.configureWithTransparentBackground()
Run Code Online (Sandbox Code Playgroud)

  • 这使得整个背景透明。如果您只想消除阴影,请使用“navBarAppearance.shadowColor = UIColor.clear”。 (3认同)
  • 哈哈,这是一个内置功能。在谷歌上搜索了几页代码,找到了这个衬里。 (2认同)

rez*_*afi 7

要从Swift 3+中删除UINavigationBar的边框,请使用:

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
UINavigationBar.appearance().isTranslucent = false
Run Code Online (Sandbox Code Playgroud)


Zai*_*han 7

Only this worked for me,

self.navigationController?.navigationBar.shadowImage = UIImage()
Run Code Online (Sandbox Code Playgroud)

Ref


Mau*_*ino 6

为 Swift 4 更新,以防有人想知道

navigationBar.shadowImage = UIImage()
navigationBar.backIndicatorImage = UIImage()
Run Code Online (Sandbox Code Playgroud)

现在更不冗长了。


Mic*_*sen 6

Jack Chen的Swiftier方法:

extension UINavigationController {

    var isHiddenHairline: Bool {
        get {
            guard let hairline = findHairlineImageViewUnder(navigationBar) else { return true }
            return hairline.isHidden
        }
        set {
            if let hairline = findHairlineImageViewUnder(navigationBar) {
                hairline.isHidden = newValue
            }
        }
    }

    private func findHairlineImageViewUnder(_ view: UIView) -> UIImageView? {
        if view is UIImageView && view.bounds.size.height <= 1.0 {
            return view as? UIImageView
        }

        for subview in view.subviews {
            if let imageView = self.findHairlineImageViewUnder(subview) {
                return imageView
            }
        }

        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)

使用:

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.isHiddenHairline = true
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.isHiddenHairline = false
    }
Run Code Online (Sandbox Code Playgroud)


Gul*_*ulz 5

对于斯威夫特3

viewDidLoad方法中

navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
Run Code Online (Sandbox Code Playgroud)