增加NavigationBar高度

4

我有以下代码:

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都对齐到底部。如何使它们对齐到顶部,以便我可以自己添加更多到底部?我的效果如下图所示:

enter image description here

是否可能将其对齐到顶部?


请检查我的答案并告诉我代码是否有效... - Joe
2个回答

2
很遗憾,你不能这样做。在UINavigationBar中的视图层次结构是私有的,因此你不能在不迭代子视图并进行各种hack操作的情况下操纵它。这可能不是一个好主意。
出于好奇,我使用视图调试器查看了iOS 10中的消息应用程序,因为他们显然这样做了。他们实际上通过添加自己的UIButton来替换后退和rightBarButtonItem来实现布局。这是你可以做到的,但是他们还将其中一个内部(且私有)内容视图的alpha设置为零,以使原始内容不再可见。
很遗憾,你不太容易做到这一点。你可以尝试各种hack操作,直到它能正常工作,但请记住,你还需要处理推送/弹出、通话状态栏、交互式转换和旋转事件。
但是,如果你不是想要iMessage风格,只是想在导航栏下方添加一些内容,为什么不考虑将UIVisualEffectView固定到UIViewController的topLayoutGuide中呢?你可以很容易地获得一个相当不错的外观,并且可以避免大量的hack操作。以下是一个示例:

Example


你知道谷歌在Hangouts应用程序中是如何做到的吗? - KVISH
@KVISH:我怀疑他们有一种定制的导航控制器,因为它与标准的UINavigationController相差很大,但我不确定。 - liamnichols

1

尝试这段代码:

注意: 代码在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")

}

输出:

enter image description here


答案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 像素。

enter image description here

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

enter image description here

希望以上代码解决了你的问题。

还有一个问题,苹果是如何让用户按下返回按钮时产生如此流畅的动画效果的?当返回页面时,它会增大和缩小! - KVISH
你可以尝试这样做......func backTapped(sender: UIBarButtonItem) { navigationController?.popViewControllerAnimated(true) } .....未经测试的代码。所以,请告诉我。 - Joe
有什么进展吗?我刚刚在VC转换时创建了一个简单的后退按钮动画...让我知道。我会更新答案... - Joe
我有动画,但我正在寻找类似于苹果消息的东西。当您用手指滑动以查看上一个屏幕时,导航栏会慢慢更新。这也出现在谷歌的Hangouts应用中。 - KVISH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接