如何快速移除导航栏的边界?

我一直在试图移除导航栏边界,但运气不好。我已经研究过,人们似乎告诉设置阴影图像和背景图像为零,但这并不适用于我的情况。

我的原则

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

插图:

enter image description here

103596 次浏览

问题在于这两句台词:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: ""), forBarMetrics: UIBarMetrics.Default)
self.navigationController?.navigationBar.shadowImage = UIImage(named: "")

因为您没有没有名称的图像,所以 UIImage(named: "")返回 nil,这意味着默认行为启动:

当非空时,显示一个自定义的阴影图像来代替默认的阴影图像。要显示自定义阴影,还必须使用-setBackoundImage: forBarMetrics: 设置自定义背景图像(如果使用默认背景图像,将使用默认阴影图像)。

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

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()

如果你想不改变背景颜色就这样做:

// Remove the border ImageView from the NavigationBar background
func hideBottomBorder() {
for view in navigationBar.subviews.filter({ NSStringFromClass($0.dynamicType) == "_UINavigationBarBackground" }) as [UIView] {
if let imageView = view.subviews.filter({ $0 is UIImageView }).first as? UIImageView {
imageView.removeFromSuperview()
}
}
}

注意: 这可能会在生产应用程序上崩溃。显然导航栏不喜欢它的视图消失

在设置色彩之前将 barStyle设置为 .Black:

self.navigationController?.navigationBar.translucent = false
self.navigationController?.navigationBar.barStyle = .Black
self.navigationController?.navigationBar.barTintColor = UIColor.blueColor()

这将完全消除阴影图像

for parent in self.navigationController!.navigationBar.subviews {
for childView in parent.subviews {
if(childView is UIImageView) {
childView.removeFromSuperview()
}
}
}

边框线是一个 UIImageView,删除一个子视图是一个 imageView 将删除带有 UIImageView 的 barButtonItems。下面的代码将帮助您删除它。希望这能帮助像我这样面临问题的人。

for parent in self.navigationController!.navigationBar.subviews {
for childView in parent.subviews {
if childView.frame.height == 0.5 {
childView.removeFromSuperview()
}
}
}

边框 UIImageView 的高度只有0.5,因此此代码只删除。

应用代理中,这在全局范围内改变了 NavBar 的格式,并删除了底线/边框:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {


UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().tintColor = UIColor.whiteColor()
UINavigationBar.appearance().barTintColor = UIColor.redColor()
UINavigationBar.appearance().translucent = false
UINavigationBar.appearance().clipsToBounds = false
//UINavigationBar.appearance().backgroundColor = UIColor.redColor()
UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : (UIFont(name: "FONT NAME", size: 18))!, NSForegroundColorAttributeName: UIColor.whiteColor()] }

还没有设法在一个特定的 VC 上实现任何不同的东西,但是这将帮助90% 的人

使用 Swift 2你可以这样做:

应用委托文件

在 func 应用程序内部(... ,did FinishLaunchingWithOptions launchOptions: ...)

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)

对于 Swift 3:

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)

Luca Davanzo 的回答很棒,但是在 iOS10中不起作用。我把它改成了 iOS10及以下版本。

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

您还可以扩展 UINavigationController 并取消此操作。在线的 removeFromSuperview()在 iOS10上不能工作,所以我将 alpha 设置为0,这样这个调用在任何地方都是兼容的。

这是快速三垒内特库克答案

   self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()

快速3

viewDidLoad方法中

navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()

对于雨燕来说,你应该用稍微不同的方式写:

 self.navigationController?.navigationBar.setBackgroundImage(UIImage(),
for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()

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

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
UINavigationBar.appearance().isTranslucent = false

只要把它写在 UINavigationBar 的扩展中

extension UINavigationBar {


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

在你看来,控制器..。

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.shouldRemoveShadow(true)
}

要撤消任何 viewController 的这个操作,只需传递 false。

只不过这招对我管用,

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

裁判

更新为 Swift 4以防有人好奇

navigationBar.shadowImage = UIImage()
navigationBar.backIndicatorImage = UIImage()

现在没那么冗长了。

IOS11和 Swift 4 如果你想移除边框,但又不想让导航栏变得半透明,你应该尝试下面的方法
self.navigationBar.shadowImage = UIImage()

Swift 4 & Swift 5

移除边框:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for:.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.layoutIfNeeded()

恢复边界:

self.navigationController?.navigationBar.setBackgroundImage(nil, for:.default)
self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.layoutIfNeeded()

这是 Gaurav Chandarana答案的简化版。

extension UINavigationBar {


func hideShadow(_ value: Bool = true) {
setValue(value, forKey: "hidesShadow")
}
}

这个被接受的答案对我很有用,但是我注意到当我想要阴影图像在弹回或者向前推到另一个 vc 的时候,导航栏上有一个明显的闪烁。

使用此方法 navigationController?.navigationBar.setValue(true, forKey: "hidesShadow") 阴影条隐藏在当前可见视图控制器中。

使用这两种方法

navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
navigationController?.navigationBar.setValue(false, forKey: "hidesShadow")

在 viewWill 消失眨眼仍然发生,但只有当阴影图像重新出现,而不是导航栏本身。

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)


// 1. hide the shadow image in the current view controller you want it hidden in
navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
navigationController?.navigationBar.layoutIfNeeded()
}


override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(true)


// 2. show the shadow image when pushing or popping in the next view controller. Only the shadow image will blink
navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
navigationController?.navigationBar.setValue(false, forKey: "hidesShadow")
navigationController?.navigationBar.layoutIfNeeded()
}

应用程序委托

UINavigationBar.appearance().setBackgroundImage(UIImage(), for: UIBarMetrics.default)
UINavigationBar.appearance().shadowImage = UIImage()

如果只想删除底线并保持导航栏的纯色,请在 viewDidLoad 中添加以下代码行: 斯威夫特3,4:

navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = false

和平!

在您的自定义导航控制器中添加以下行:

self.navigationBar.setBackgroundImage(UIImage(), for:.default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.layoutIfNeeded()

重要提示

如果您使用第一行 viewDidLoad ()方法,那么最后一行很重要,因为导航控制器应该重新绘制导航条,但是在 viewWillAppear ()方法中,在它绘制导航条之前,您可以很容易地在没有 layoutIfNeeded ()的情况下使用该方法

Swift 5

当使用 setBackoundImage/ShadowImage 来隐藏发际线时,会有一点延迟。此方法消除了延迟。归功于 变色龙框架。这是他们使用的方法(在 OBC 中)


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


陈更快的方法:

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

使用:

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


override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationController?.isHiddenHairline = false
}
let navBarAppearance = UINavigationBarAppearance()
navBarAppearance.configureWithTransparentBackground()

我使用这段代码在 Appgenerate 的 diFinishLaunchingWithOptions 方法中到达整个应用程序:

 let barAppearance = UINavigationBar.appearance()
    

if #available(iOS 13, *) {
let appearance = UINavigationBarAppearance()
appearance.configureWithTransparentBackground()
barAppearance.standardAppearance = appearance
barAppearance.scrollEdgeAppearance = appearance
} else {
barAppearance.setBackgroundImage(UIImage(), for: UIBarPosition.any, barMetrics: UIBarMetrics.defaultPrompt)
barAppearance.shadowImage = UIImage()
}

IOS13 + :

let appearance = UINavigationBarAppearance()
appearance.shadowColor = .clear

把这个外观分配给 UINavigationBar:

navigationController?.navigationBar.standardAppearance = appearance
navigationController?.navigationBar.scrollEdgeAppearance = appearance
navigationController?.navigationBar.compactAppearance = appearance

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

我发现将导航条阴影颜色从 活动督察改为 安全可以解决这个问题

[ 更改导航条阴影颜色 * * * 强文本][1]

[1] : https://i.stack.imgur.com/i3Kdo.png***strong文本 * * *