在swift中删除导航栏中的边框

时间:2014-10-15 18:59:03

标签: ios iphone swift uinavigationbar

我一直试图在没有运气的情况下删除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: "")

说明:

enter image description here

25 个答案:

答案 0 :(得分:233)

麻烦在于这两行:

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

由于您没有没有名称的图片,UIImage(named: "")会返回nil,这意味着默认行为会启动:

  

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

您需要一个真正空白的图片,因此只需使用UIImage()初始化:

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

答案 1 :(得分:35)

这将完全删除阴影图像

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

答案 2 :(得分:30)

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

AppDelegate文件

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

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

对于Swift 3:

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

答案 3 :(得分:26)

只需在UINavigationBar

的扩展名中写下这个
extension UINavigationBar {

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

在你的viewController中......

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

为了解决任何viewController的问题,只需传递false。

答案 4 :(得分:18)

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()

答案 5 :(得分:13)

在设置色调之前将update simple_web_content set web_content_definition_id = (select wcd.web_content_definition_id from wc_content_definition wcd, simple_web_content swc where simple_web_content_id = wcd.web_content_id ) and swc.simple_web_content_id <> 0 and wcd.web_content_id <> 0; 设置为barStyle

.Black

答案 6 :(得分: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
            }
        }
    }
}

您还可以扩展UINavigationController并将其调用。该行上的removeFromSuperview()将无法在iOS 10上运行,因此我只需将alpha设置为0,这样这一个调用就可以在任何地方兼容。

答案 7 :(得分:6)

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

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

答案 8 :(得分:5)

for swift 3

viewDidLoad方法

中的

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

答案 9 :(得分:4)

let navBarAppearance = UINavigationBarAppearance()
navBarAppearance.configureWithTransparentBackground()

答案 10 :(得分:4)

如果有人想知道

,请更新Swift 4
navigationBar.shadowImage = UIImage()
navigationBar.backIndicatorImage = UIImage()

现在它更加冗长。

答案 11 :(得分:3)

只有这对我有用,

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

Ref

答案 12 :(得分:3)

快速5

当使用setBackgroundImage / shadowImage隐藏发际线时,会有一些延迟。此方法消除了延迟。归功于Chameleon Framework。这是他们使用的方法(在ObjC中)

xxd -p $file | tr -d '\n' | sed 's/\(..\)/\\x\1/g'

答案 13 :(得分:3)

如果你想在不改变背景颜色的情况下这样做,那就是这样的:

// 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()
        }
    }
}

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

答案 14 :(得分:2)

Jack Chen的快速方法:

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
    }

答案 15 :(得分:1)

对于swift3,你应该用稍微不同的方式写一下:

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

答案 16 :(得分:1)

这是Gaurav Chandarana的答案的简化版本。

extension UINavigationBar {

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

答案 17 :(得分:1)

可接受的答案对我有用,但是当我弹出或向前推到另一个vc时,当我希望阴影图像重新出现时,我注意到导航栏中出现了明显的闪烁。

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

使用这两种方法

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

在viewWillDisappear中,眨眼仍然会发生,但仅在重新出现阴影图像而不是导航栏本身时才会发生。

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

答案 18 :(得分:0)

这是Nate Cook答案的快速3基础的答案

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

答案 19 :(得分:0)

AppDelegate 中,这已全局更改了导航栏的格式并删除了底线/边框:

 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%的人

答案 20 :(得分:0)

iOS 11和Swift 4 如果要删除边框但不要使导航条保持半透明,则应尝试按照
self.navigationBar.shadowImage = UIImage()

答案 21 :(得分:0)

边框线是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,因此此代码仅删除了。

答案 22 :(得分:0)

应用委托

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

答案 23 :(得分:0)

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

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

和平!

答案 24 :(得分:0)

在您的自定义navigationController中添加以下行:

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

重要提示

如果您使用第一行viewDidLoad()方法,那么最后一行很重要,因为navigationController应该重绘导航栏,但是在绘制导航栏之前,您可以轻松地在viewWillAppear()方法中不使用layoutIfNeeded()来使用它