UINavigationBar 1px の下の線を非表示にする方法 質問する

UINavigationBar 1px の下の線を非表示にする方法 質問する

ナビゲーション バーをコンテンツに溶け込ませる必要のあるアプリがあります。

この迷惑な小さなバーを消す方法、または色を変える方法を誰か知っていますか?

下の画像の状況では、「ルートビューコントローラー」の下の1ピクセルの高さの線について話しています。

ここに画像の説明を入力してください

ベストアンサー1

iOS 13の場合:

使用.shadowColor財産

このプロパティがnilまたはクリアカラーの場合、バーには影が表示されません。

例えば:

let navigationBar = navigationController?.navigationBar
let navigationBarAppearance = UINavigationBarAppearance()
navigationBarAppearance.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearance

iOS 12 以下の場合:

これを行うには、カスタムの影画像を設定する必要があります。ただし、影画像を表示するには、カスタムの背景画像も設定する必要があります。Apple のドキュメントからの引用です。

カスタム シャドウ イメージを表示するには、setBackgroundImage(_:for:) メソッドを使用してカスタム背景イメージも設定する必要があります。デフォルトの背景イメージが使用されている場合は、このプロパティの値に関係なく、デフォルトのシャドウ イメージが使用されます。

それで:

let navigationBar = navigationController!.navigationBar
navigationBar.setBackgroundImage(#imageLiteral(resourceName: "BarBackground"),
                                                        for: .default)
navigationBar.shadowImage = UIImage()

上記は、これを非表示にする唯一の「公式」の方法です。残念ながら、バーの半透明性は失われます。

背景画像は必要ありません。色だけが必要です。

以下のオプションがあります:

  1. 無地、透け感なし:

     navigationBar.barTintColor = UIColor.redColor()
     navigationBar.isTranslucent = false
     navigationBar.setBackgroundImage(UIImage(), for: .default)
     navigationBar.shadowImage = UIImage()
    
  2. 色で塗りつぶされた小さな背景画像を作成して使用します。

  3. 以下に説明する「ハッキー」な方法を使用します。これにより、バーも半透明に保たれます。

バーを透明に保つにはどうすればいいですか?

UIImageView半透明性を保つには、別のアプローチが必要です。これはハックのように見えますが、うまく機能します。削除しようとしている影は、の下のどこかにあるヘアラインですUINavigationBar。それを見つけて、必要に応じて非表示/表示することができます。

以下の手順では、階層内の 1 つのコントローラーでのみヘアラインを非表示にする必要があることを前提としていますUINavigationController

  1. インスタンス変数を宣言します。

    private var shadowImageView: UIImageView?
    
  2. この影(ヘアライン)を見つけるメソッドを追加しますUIImageView:

    private func findShadowImage(under view: UIView) -> UIImageView? {
        if view is UIImageView && view.bounds.size.height <= 1 {
            return (view as! UIImageView)
        }
    
        for subview in view.subviews {
            if let imageView = findShadowImage(under: subview) {
                return imageView
            }
        }
        return nil
    }
    
  3. メソッドの追加/編集viewWillAppear/viewWillDisappear:

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    
        if shadowImageView == nil {
            shadowImageView = findShadowImage(under: navigationController!.navigationBar)
        }
        shadowImageView?.isHidden = true
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    
        shadowImageView?.isHidden = false
    }
    

同じ方法は、UISearchBar生え際や、(ほぼ)隠す必要のある他の部分にも有効です :)

オリジナルのアイデアを提供してくれた @Leo Natan に感謝します!

おすすめ記事