2017-08-24 89 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

创建导航控制器参考,然后在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 
     } 
    }