如何在 Swift 中增加自定义 UINavigationBar 类的高度
Posted
技术标签:
【中文标题】如何在 Swift 中增加自定义 UINavigationBar 类的高度【英文标题】:How to increase height for a custom UINavigationBar class in Swift 【发布时间】:2017-08-24 05:19:15 【问题描述】:更新:我最终隐藏了默认导航栏并添加了一个与导航栏看起来相同的 UIView。这听起来可能不太好,但与其修补到 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 ...
不确定,所有方法都被调用,为什么?
【问题讨论】:
您是否尝试过以编程方式添加导航栏? 创建导航控制器引用,然后在导航栏上初始化它的新引用。你可以用框架初始化导航栏 嗨马拉夫,谢谢你的回复兄弟。我在 UIStoryboard 和编程中都尝试过,但没有帮助。我刚刚通过替换默认导航栏添加了UIView
。这对我的应用来说是一个很好的解决方案。
【参考方案1】:
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)
【讨论】:
【参考方案2】:layoutSubviews 也可以覆盖 func sizeThatFits(_ size: CGSize)。 所以如果它不是 sizeThatFits 调用,请不要担心。我检查了 layoutSubviews Navigationbar 的高度正在改变。
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
【讨论】:
【参考方案3】:试试这样,这在 Swift 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
。
【讨论】:
【参考方案4】:如下修改你的代码
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;
可能对你有用。
【讨论】:
以上是关于如何在 Swift 中增加自定义 UINavigationBar 类的高度的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中归档和取消归档自定义对象?或者如何在 Swift 中将自定义对象保存到 NSUserDefaults?
Swift - 如何在 2 个视图控制器之间导航时删除黑色导航栏