【问题标题】:Increase NavigationBar height增加导航栏高度
【发布时间】:2016-10-29 05:35: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 都与底部对齐。如何让它们与顶部对齐,以便我自己在底部添加更多内容?根据图片,我得到了一些东西:

是否可以让它与顶部对齐?

【问题讨论】:

  • 检查我的答案,让我知道代码有效...

标签: ios swift uinavigationbar uibarbuttonitem


【解决方案1】:

很遗憾,您不能这样做。

UINavigationBar 中的视图层次结构是私有的,因此您无法在不迭代子视图并对其进行修改的情况下对其进行操作。这可能不是一个好主意。

出于好奇,我使用视图调试器查看了 iOS 10 中的 Messages 应用程序,因为它们显然是这样做的。他们实际上是通过添加自己的UIButton 来代替后面和rightBarButtonItem 来实现布局的。这是您可以做的事情,但是他们还将内部(和私有)内容视图之一的 alpha 设置为零,以便原始内容不再可见。
不幸的是,这是您无法轻易做到的事情。您可以尝试破解一些东西,直到它起作用,但请记住,您还需要处理推送/弹出、呼叫状态栏、交互式转换和旋转事件。

但是,如果您不喜欢 iMessage 样式,而只是想在导航栏下方添加一些内容,为什么不将UIVisualEffectView 固定到topLayoutGuide 中的UIViewController 中呢?你可以很容易地得到一个相当漂亮的外观,它可以节省很多黑客的东西。这是一个例子:

【讨论】:

  • 你知道 Google 在环聊应用中是如何做到的吗?
  • @KVISH:我怀疑他们有某种自定义导航控制器,从它与标准 UINavigationController 的差异来判断,但我不确定
【解决方案2】:

试试这个代码:

注意:代码在 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方法中有效。但是,没有运气。什么时候,我在其他viewLoad方法中尝试了这段代码。

输出 1: barButtonItem 垂直向上移动了 20 个像素。

输出 2: barButtonItem 垂直向下移动了 20 个像素。

希望以上代码能解决您的问题。

【讨论】:

  • 还有一个问题,Apple 是如何做到的,以便在用户按下后退按钮时动画效果如此出色?转到页面时,返回时增加和减少!
  • 你可以试试这样的.....func backTapped(sender: UIBarButtonItem) { navigationController?.popViewControllerAnimated(true) } .....未经测试的代码.so,让我知道跨度>
  • 运气好吗?我刚刚在 VC 转换时在后退按钮上创建了一个简单的动画......让我知道。我会更新答案...
  • 我有动画,但我正在寻找类似 Apple 消息的东西。当您用手指滑动查看前一个屏幕时,导航栏会慢慢更新。它也在谷歌环聊应用程序上。
猜你喜欢
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 2017-11-14
  • 2015-11-03
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多