ios - 扩展 UINavigationBar 高度

标签 ios swift uinavigationbar

我跟着here让更大的导航栏工作。结果是它看起来更大,但并非栏中的所有元素实际上都展开了,这意味着我只能与导航栏原始大小中的项目进行交互。这是我的痛点,因为我试图扩展 UINavigationBar 以将按钮放在扩展区域中,但无法按下这些按钮。

这是我的代码:

@IBDesignable
class CustomNavigationBar: UINavigationBar {

    var customHeight: CGFloat = 88

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        let button = UIButton(frame: CGRect(x: 0, y: 44, width: 100, height: 44))
        button.setTitle("Button", for: .normal)
        button.backgroundColor = .red
        button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
        self.addSubview(button)    
    }

    @objc func buttonAction() {
        print("button pressed")
    }

    override func sizeThatFits(_ size: CGSize) -> CGSize {
        return CGSize(width: UIScreen.main.bounds.width, height: customHeight)
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        for subview in self.subviews {
            var stringFromClass = NSStringFromClass(subview.classForCoder)
            if stringFromClass.contains("UIBarBackground") {
                subview.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: customHeight)
                subview.backgroundColor = .green
                subview.sizeToFit()
            }
            stringFromClass = NSStringFromClass(subview.classForCoder)
            if stringFromClass.contains("UINavigationBarContentView") {
                subview.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: customHeight)
                subview.backgroundColor = .black
                subview.sizeToFit()
            }
        }
    }
}

这是该输出的屏幕截图:

enter image description here

您可以在这里看到,当我在 layoutSubviews() 函数中调整 UIBarBackground 的大小时,我将其设为绿色并将其设置为自定义高度,这很有效。但是,当我调整 UINavigationBarContentView 的大小并将其颜色设置为黑色时,颜色设置正常,但高度保持在 44。

请看下面的调试 View 层次结构的屏幕截图,我们看到实际上有两个项的原始高度仍为 44。

enter image description here

所有这些意味着我根本无法按下 View 中的按钮。但是,如果我将它向上移动一点,使其位于 44 高度以内,那么我就可以按下它。

寻求有关如何正确调整此导航栏所有方面的帮助

编辑

如果我从 UInavigationBarContentView 中删除 subview.sizeToFit(),它会将其调整为正确的大小。我还注意到覆盖的 sizeThatFits 从未被调用?

最佳答案

我之前尝试过改变高度,但我也做不到,但是 我制作自定义导航 Controller 并在 viewDidLoad 上调用它并通过执行隐藏 native 导航 Controller

self.navigationController?.navigationBar.isHidden = true

我在同一个地方显示自定义,我把我的 View 放在这个导航 Controller 上,如果你愿意,你也可以在这个自定义导航栏的高度上做动画

希望对你有帮助

关于ios - 扩展 UINavigationBar 高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49937411/

相关文章:

ios - 空闲连接 - 超时 - XMPP 连接

ios - 用户在 Firebase 上使用 Google 登录后,如何在 swiftUI 中重新呈现我的 View ?

ios - 如何在 iOS 11 中正确设置 UINavigationBar 高度

ios - 我想在特定 View 上隐藏 iOS 导航栏

ios - Swift 将数组作为参数传递错误

ios - 无法将记录的文件列出到 TableView

swift - 整数转换为通用类型以计算平均值。非标称类型不支持显式初始化

iphone - 从 UINavigationBar 中的按钮中删除发光效果

ios - Facebook 无法检索 iPhone 商店 ID?

ios - 获取 uitextview 的字体粗细