如何在Swift中增加自定义UINavigationBar类的高度
问题描述:
更新:我最后隐藏了默认的导航栏并添加了一个与导航栏相同的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 {...}
不知道,为什么呢?
答
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)
答
更改您的代码像下面
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;
}
或许对你来说工作。
答
尝试这样的,这个工作对我来说在斯威夫特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
。
答
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
}
}
您是否试图通过编程方式添加导航栏? –
创建导航控制器参考,然后在NavBar上初始化它的新参考.. 您可以初始化导航栏与框架 –
嗨马拉夫,感谢您的答复兄弟。我用UIStoryboard&编程方式尝试过,但没有帮助。我只是通过替换默认导航栏添加了一个'UIView'。这是我的应用的一个很好的解决方案。 – Hemang