私は幸運なしに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: "")
図:
問題は次の2行にあります。
self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: ""), forBarMetrics: UIBarMetrics.Default)
self.navigationController?.navigationBar.shadowImage = UIImage(named: "")
名前のない画像がないため、UIImage(named: "")
はnil
を返します。これは、デフォルトの動作が開始されることを意味します。
非nilの場合、デフォルトの影画像の代わりに表示するカスタム影画像。カスタムシャドウを表示するには、カスタムバックグラウンドイメージも-setBackgroundImage:forBarMetricsで設定する必要があります(デフォルトのバックグラウンドイメージを使用する場合は、デフォルトのシャドウイメージが使用されます)。
本当に空の画像が必要なので、UIImage()
で初期化するだけです:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
これにより、影の画像が完全に削除されます
for parent in self.navigationController!.navigationBar.subviews {
for childView in parent.subviews {
if(childView is UIImageView) {
childView.removeFromSuperview()
}
}
}
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)
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を渡すだけです。
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()
色合いを設定する前に、barStyle
を.Black
に設定します。
self.navigationController?.navigationBar.translucent = false
self.navigationController?.navigationBar.barStyle = .Black
self.navigationController?.navigationBar.barTintColor = UIColor.blueColor()
Luca Davanzoの答えは素晴らしいですが、iOS 10では動作しません。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()
はiOS 10では機能しないため、アルファを0に設定しただけなので、この1つの呼び出しはどこでも互換性があります。
Swift 3+のUINavigationBarから境界線を削除するには、次を使用します。
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
UINavigationBar.appearance().isTranslucent = false
Swift 3の場合
viewDidLoad
メソッド
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
誰かが疑問に思っている場合に備えて、Swift 4用に更新
navigationBar.shadowImage = UIImage()
navigationBar.backIndicatorImage = 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()
}
}
}
注:これは、運用アプリでクラッシュする可能性があります。どうやらNavigationBarはビューが消えることを嫌います
swift3の場合は、少し異なる方法で記述する必要があります。
self.navigationController?.navigationBar.setBackgroundImage(UIImage(),
for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
これは Gaurav Chandarana の答えの合理化されたバージョンです。
extension UINavigationBar {
func hideShadow(_ value: Bool = true) {
setValue(value, forKey: "hidesShadow")
}
}
受け入れられた答えは私のために働いたが、私は戻って別のvcにポップまたは前方に押したときに影のイメージを再表示したいときに、ナビゲーションバーに顕著な点滅があることに気づいた。
ViewWillAppearでこのメソッドnavigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
を使用すると、現在の表示ビューコントローラーでシャドウバーが非表示になります。
これら2つの方法を使用する
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()
}
アプリデリゲート
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: UIBarMetrics.default)
UINavigationBar.appearance().shadowImage = UIImage()
境界線は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だけなので、このコードはそれだけを削除します。
一番下の行のみを削除し、navigationBarの単色を維持する場合は、viewDidLoadに次のコード行を追加します:Swift 3、4:
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = false
平和!
これは、Nate CookのSwift 3 baseの答えです。
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
AppDelegate内で、これにより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%に役立ちます
iOS 11およびSwift 4境界線を削除するが、ナビゲーションバーを半透明にしない場合は、以下を試してください。self.navigationBar.shadowImage = UIImage()