我一直试图在没有运气的情况下删除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: "")
说明:
答案 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 4navigationBar.shadowImage = UIImage()
navigationBar.backIndicatorImage = UIImage()
现在它更加冗长。
答案 11 :(得分:3)
答案 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)
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()来使用它