2017-08-24 5 views
1

更新:デフォルトのナビゲーションバーを隠して終了し、ナビゲーションバーと同じように見えるUIViewを追加しました。これは良いとは思わないかもしれませんが、UINavigationBarにパッチする代わりに、これは良いことです。SwiftのカスタムUINavigationBarクラスの高さを増やす方法


これは私が私のアプリでナビゲーションバーの高さを高めるために作成した私のカスタムUINavigationBarクラスです。それは私にとってはうまくいかない。ここにはcodeがあります。

class PPBaseNavigationBar: UINavigationBar { 

    ///The height you want your navigation bar to be of 
    static let navigationBarHeight: CGFloat = 83.0 

    ///The difference between new height and default height 
    static let heightIncrease: CGFloat = navigationBarHeight - 44 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     initialize() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     initialize() 
    } 

    private func initialize() { 
     let shift = PPBaseNavigationBar.heightIncrease/2.0 

     ///Transform all view to shift upward for [shift] point 
     self.transform = CGAffineTransform(translationX: 0, y: -shift) 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     let shift = PPBaseNavigationBar.heightIncrease/2.0 

     ///Move the background down for [shift] point 
     var classNamesToReposition: Array<String>? 
     if #available(iOS 10.0, *) { 
      classNamesToReposition = ["_UIBarBackground"] 
     } else { 
      classNamesToReposition = ["_UINavigationBarBackground"] 
     } 

     for view: UIView in self.subviews { 
      if (classNamesToReposition?.contains(NSStringFromClass(view.classForCoder)))! { 
       let bounds: CGRect = self.bounds 
       var frame: CGRect = view.frame 
       frame.origin.y = bounds.origin.y + shift - 20.0 
       frame.size.height = bounds.size.height + 20.0 
       view.frame = frame 
      } 
     } 
    } 

    override func sizeThatFits(_ size: CGSize) -> CGSize { 
     let amendedSize:CGSize = super.sizeThatFits(size) 
     let newSize:CGSize = CGSize.init(width: amendedSize.width, height: PPBaseNavigationBar.navigationBarHeight) 
     return newSize; 
    } 
} 

override func sizeThatFits(_ size: CGSize) -> CGSize {...}以外のすべてのメソッドが呼び出されるのはなぜですか?

+0

プログラムでナビゲーションバーを追加しようとしましたか? –

+0

Navigation Controllerリファレンスを作成し、Navbarで新しいリファレンスを初期化します。 フレーム付きのinit navbarを使用できます。 –

+1

こんにちはマラブです。私はUIStoryboardとプログラムで両方を試しましたが、助けにはなりませんでした。私はちょうどデフォルトのナビゲーションバーを置き換えることによって 'UIView'を追加しました。これは私のアプリケーションのための良い解決策です。 – Hemang

答えて

3
It is not permissible to change the navigation bar object or modify its bounds, frame, or alpha values directly. 

Modifying the Navigation Bar Object Directly

あなたは、ナビゲーションバーなどのカスタムビューを使用することができます。このように試してみてくださいあなたの条件(例えば、変更高さ)ごとにビューをカスタマイズし、

self.navigationController?.setNavigationBarHidden(true, animated: false) 
0

以下
open override func sizeThatFits(_ size: CGSize) -> CGSize { 
     let amendedSize:CGSize = super.sizeThatFits(size) 
     let newSize:CGSize = CGSize.init(width: amendedSize.width, height: PPBaseNavigationBar.navigationBarHeight) 
     return newSize; 
    } 

のようなあなたのコードがあなたのために働いていたことかもしれません変更し

1

として、デフォルトのナビゲーションバーを非表示にするには、これはスウィフト3で私のために働い:

extension UINavigationBar { 

    override open func sizeThatFits(_ size: CGSize) -> CGSize { 
     return CGSize(width: UIScreen.main.bounds.size.width, height: "Your custom height") 
    } 

} 


// MARK: - View life cycle methods 

class DVNavigationController: UINavigationController { 

    override func viewWillLayoutSubviews() { 
     super.viewWillLayoutSubviews() 
     navigationBar.frame.size.height = "Your custom height" 
    } 

} 

が最後にこのカスタムUINavigationControllerクラスを割り当てますnavigationControllerに送信してください。

1

layoutSubviewsも同様に機能します。func sizeThatFits(_ size:CGSize)。 sizeThatFitsが呼び出されていないかどうかは心配しないでください。 layoutSubviewsナビゲーションバーの高さが変化しています。

for view: UIView in self.subviews { 
     if (classNamesToReposition?.contains(NSStringFromClass(view.classForCoder)))! { 
      let bounds: CGRect = self.bounds 
      var frame: CGRect = view.frame 
      frame.origin.y = bounds.origin.y + shift - 20.0 
      frame.size.height = bounds.size.height + 150.0 
      view.frame = frame 
     } 
    } 
関連する問題