web-dev-qa-db-ja.com

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: "")

図:

enter image description here

97
Peter Pik

問題は次の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()
252
Nate Cook

これにより、影の画像が完全に削除されます

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

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)
31
Jorge Casariego

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を渡すだけです。

29

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

色合いを設定する前に、barStyle.Blackに設定します。

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

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つの呼び出しはどこでも互換性があります。

9
David Baez

Swift 3+のUINavigationBarから境界線を削除するには、次を使用します。

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

Swift 3の場合

viewDidLoadメソッド

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

誰かが疑問に思っている場合に備えて、Swift 4用に更新

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

今ではさらに冗長です。

4

これだけが私のために働いた、

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

参照

3
Zaid Pathan

これは、背景色を変更せずに行う場合の方法です。

// 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はビューが消えることを嫌います

3
Yariv Nissim

swift3の場合は、少し異なる方法で記述する必要があります。

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

これは Gaurav Chandarana の答えの合理化されたバージョンです。

extension UINavigationBar {

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

受け入れられた答えは私のために働いたが、私は戻って別の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()
}
1
Lance Samaria

アプリデリゲート

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

境界線は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だけなので、このコードはそれだけを削除します。

0
bachman

一番下の行のみを削除し、navigationBarの単色を維持する場合は、viewDidLoadに次のコード行を追加します:Swift 3、4:

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

平和!

0
Mihail Salari

これは、Nate CookのSwift 3 baseの答えです。

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

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%に役立ちます

0
David West

iOS 11およびSwift 4境界線を削除するが、ナビゲーションバーを半透明にしない場合は、以下を試してください。
self.navigationBar.shadowImage = UIImage()

0
BilalReffas