增加 NavigationBar 高度
Increase NavigationBar height
我有以下代码:
func navbarbutton() {
UIView.animateWithDuration(0.2, animations: { () -> Void in
let current = self.navigationController?.navigationBar.frame
self.navigationController?.navigationBar.frame = CGRectMake(self.frame!.origin.x, self.frame!.origin.y, self.frame!.size.width, current!.size.height + 50)
self.navigationController?.navigationBar.layoutIfNeeded()
})
}
我可以将导航栏的高度增加 50 dp。那不是我的问题。我遇到的问题是 UIBarButtonItems
都与底部对齐。我怎样才能让它们与顶部对齐,以便我可以自己在底部添加更多内容?我收到了图片中的东西:
是否可以让它与顶部对齐?
很遗憾,您不能那样做。
UINavigationBar
中的视图层次结构是私有的,因此您无法在不遍历子视图并对其进行所有处理的情况下对其进行操作。这可能不是一个好主意。
出于好奇,我使用视图调试器查看了 iOS10 中的 Messages 应用程序,因为它们显然是这样做的。他们实际上是通过添加自己的 UIButton
来替换 back 和 rightBarButtonItem 来实现布局的。这是您可以做的事情,但是他们还将内部(和私有)内容视图之一的 alpha 设置为零,以便原始内容不再可见。
不幸的是,这是您无法轻易做到的事情。您可以尝试破解直到它起作用,但请记住您还需要处理 pushes/pops,在呼叫状态栏、交互式转换和旋转事件中。
但是,如果您不喜欢 iMessage 风格,而只是想在导航栏下方添加一些内容,为什么不考虑将 UIVisualEffectView
固定到 topLayoutGuide
中呢? 14=]?您可以很容易地获得相当漂亮的外观,并且可以节省很多黑客攻击。这是一个例子:
试试这个代码:
注意: 代码在 Swift 3.
中测试
答案 1:更新答案
class ViewController: UIViewController {
var customBar: UINavigationBar = UINavigationBar()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//Title
title = "Some Title"
// Add bar button item
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Add", style: .plain, target: self, action: #selector(addTapped))
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(addTapped))
self.customBar.frame = CGRect(x:0, y:0, width:view.frame.width, height:(navigationController?.navigationBar.frame.height)! + 50)
self.customBar.backgroundColor = UIColor.green
self.view.addSubview(customBar)
}
func addTapped() {
print("Button Pressed")
}
输出:
答案2:
override var isViewLoaded: Bool {
// Add bar button item
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Add", style: .plain, target: self, action: #selector(addTapped))
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(addTapped))
//Vertical and Horizonal barButtonItem position offset
navigationItem.leftBarButtonItem?.setTitlePositionAdjustment(UIOffset(horizontal: 0, vertical: 20), for: UIBarMetrics.default)
navigationItem.rightBarButtonItem?.setTitlePositionAdjustment(UIOffset(horizontal: 0, vertical: 20), for: UIBarMetrics.default)
return true
}
func addTapped() {
print("Button Pressed")
}
注意:以上代码仅在isViewLoaded: Bool method.But中有效,没有luck.When,我试过了此代码在其他 viewLoad 方法中。
输出 1: barButtonItem 垂直向上移动 20 像素。
输出 2: barButtonItem 垂直向下移动 20 像素。
希望以上代码能解决您的问题。
我有以下代码:
func navbarbutton() {
UIView.animateWithDuration(0.2, animations: { () -> Void in
let current = self.navigationController?.navigationBar.frame
self.navigationController?.navigationBar.frame = CGRectMake(self.frame!.origin.x, self.frame!.origin.y, self.frame!.size.width, current!.size.height + 50)
self.navigationController?.navigationBar.layoutIfNeeded()
})
}
我可以将导航栏的高度增加 50 dp。那不是我的问题。我遇到的问题是 UIBarButtonItems
都与底部对齐。我怎样才能让它们与顶部对齐,以便我可以自己在底部添加更多内容?我收到了图片中的东西:
是否可以让它与顶部对齐?
很遗憾,您不能那样做。
UINavigationBar
中的视图层次结构是私有的,因此您无法在不遍历子视图并对其进行所有处理的情况下对其进行操作。这可能不是一个好主意。
出于好奇,我使用视图调试器查看了 iOS10 中的 Messages 应用程序,因为它们显然是这样做的。他们实际上是通过添加自己的 UIButton
来替换 back 和 rightBarButtonItem 来实现布局的。这是您可以做的事情,但是他们还将内部(和私有)内容视图之一的 alpha 设置为零,以便原始内容不再可见。
不幸的是,这是您无法轻易做到的事情。您可以尝试破解直到它起作用,但请记住您还需要处理 pushes/pops,在呼叫状态栏、交互式转换和旋转事件中。
但是,如果您不喜欢 iMessage 风格,而只是想在导航栏下方添加一些内容,为什么不考虑将 UIVisualEffectView
固定到 topLayoutGuide
中呢? 14=]?您可以很容易地获得相当漂亮的外观,并且可以节省很多黑客攻击。这是一个例子:
试试这个代码:
注意: 代码在 Swift 3.
中测试答案 1:更新答案
class ViewController: UIViewController {
var customBar: UINavigationBar = UINavigationBar()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//Title
title = "Some Title"
// Add bar button item
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Add", style: .plain, target: self, action: #selector(addTapped))
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(addTapped))
self.customBar.frame = CGRect(x:0, y:0, width:view.frame.width, height:(navigationController?.navigationBar.frame.height)! + 50)
self.customBar.backgroundColor = UIColor.green
self.view.addSubview(customBar)
}
func addTapped() {
print("Button Pressed")
}
输出:
答案2:
override var isViewLoaded: Bool {
// Add bar button item
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Add", style: .plain, target: self, action: #selector(addTapped))
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(addTapped))
//Vertical and Horizonal barButtonItem position offset
navigationItem.leftBarButtonItem?.setTitlePositionAdjustment(UIOffset(horizontal: 0, vertical: 20), for: UIBarMetrics.default)
navigationItem.rightBarButtonItem?.setTitlePositionAdjustment(UIOffset(horizontal: 0, vertical: 20), for: UIBarMetrics.default)
return true
}
func addTapped() {
print("Button Pressed")
}
注意:以上代码仅在isViewLoaded: Bool method.But中有效,没有luck.When,我试过了此代码在其他 viewLoad 方法中。
输出 1: barButtonItem 垂直向上移动 20 像素。
输出 2: barButtonItem 垂直向下移动 20 像素。
希望以上代码能解决您的问题。