ios - 获取大标题导航栏的默认收缩高度和展开高度

标签 ios swift uinavigationbar

我为导航栏启用了大标题:

navigationController?.navigationBar.prefersLargeTitles = true

这使得导航栏以展开的高度开始,并随着用户向下滚动而缩小。

现在,我想在导航栏内添加一个 subview ,它会根据导航栏的高度调整大小。为此,我需要获取导航栏的最大和最小高度,这样我就可以计算出它扩展了多少。

我可以这样获取导航栏的当前高度:

guard let height = navigationController?.navigationBar.frame.height else { return }
print("Navigation height: \(height)")

我在里面调用这个 scrollViewDidScroll ,当我滚动时,似乎扩展高度约为 96,收缩高度约为 44。但是,我不想对值进行硬编码。

苹果手机 12

<表类="s-表"> <头> 扩展 (96.33) 缩小 (44) <正文> enter image description here enter image description here

苹果手机 8

<表类="s-表"> <头> 扩展 (96.5) 缩小 (44) <正文> enter image description here enter image description here

我也只能在用户实际上下滚动时获取这些值,这在生产中不起作用。即使我强制用户滚动,也为时已晚,因为我需要提前知道两个高度,这样我才能插入调整大小的 subview 。

<表类="s-表"> <头> 我想获取这些值,但不需要硬编码或滚动 <正文>

有什么方法可以同时获得缩小和展开的导航栏的高度?

最佳答案

一年后遇到了我自己的问题。另一个答案没有用,所以我使用了 View 层次结构。

View Hierarchy with '_UINavigationBarContentView" selected

看起来缩小的外观嵌入了一个名为_UINavigationBarContentView的类。由于这是一个私有(private)类,我不能直接访问它。但是,它的 y 原点是 0 并且它里面有一个 UILabel。这就是我需要知道的一切!

extension UINavigationBar {
    func getCompactHeight() -> CGFloat {
        
        /// Loop through the navigation bar's subviews.
        for subview in subviews {
            
            /// Check if the subview is pinned to the top (compact bar) and contains a title label
            if subview.frame.origin.y == 0 && subview.subviews.contains(where: { $0 is UILabel }) {
                return subview.bounds.height
            }
        }
        
        return 0
    }
}

用法:

override func viewDidLoad() {
    super.viewDidLoad()
    
    self.title = "Navigation"
    
    if
        let navigationBar = navigationController?.navigationBar,
        let window = UIApplication.shared.keyWindow
    {
        navigationBar.prefersLargeTitles = true /// Enable large titles.
        
        let compactHeight = navigationBar.getCompactHeight() // 44 on iPhone 11
        let statusBarHeight = window.safeAreaInsets.top // 44 on iPhone 11
        let navigationBarHeight = compactHeight + statusBarHeight
        print(navigationBarHeight) // Result: 88.0
    }
}

这个答案的缺点是,如果 Apple 更改了 UINavigationBar 的内部结构,它可能无法工作。不过对我来说已经足够好了。

关于ios - 获取大标题导航栏的默认收缩高度和展开高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65527339/

相关文章:

ios - Root View Controller 偶尔丢失

ios - 语法错误 : Unexpected token M (when running cordova project from Visual Studio 2015)

ios - 自定义警报 View Controller 以在 IOS 中选择日期

ios - 如何检查应用程序/项目中是否存在特定的 UIViewController

TableView 导航栏上的 IOS 按钮不起作用

objective-c - 设置UILABEL的初始值

swift - 如何将值从 EnvironmentObject 传递到 SwiftUI 中的类实例?

swift - 实时绘图哪种方式更好?

ios - 当我将透明设置为否时,双击导航栏

ios - 在 iOS 11.2.2 上隐藏后退按钮