我为导航栏启用了大标题:
navigationController?.navigationBar.prefersLargeTitles = true
这使得导航栏以展开的高度开始,并随着用户向下滚动而缩小。
现在,我想在导航栏内添加一个 subview ,它会根据导航栏的高度调整大小。为此,我需要获取导航栏的最大和最小高度,这样我就可以计算出它扩展了多少。
我可以这样获取导航栏的当前高度:
guard let height = navigationController?.navigationBar.frame.height else { return }
print("Navigation height: \(height)")
我在里面调用这个 scrollViewDidScroll
,当我滚动时,似乎扩展高度约为 96,收缩高度约为 44。但是,我不想对值进行硬编码。
苹果手机 12
苹果手机 8
我也只能在用户实际上下滚动时获取这些值,这在生产中不起作用。即使我强制用户滚动,也为时已晚,因为我需要提前知道两个高度,这样我才能插入调整大小的 subview 。
有什么方法可以同时获得缩小和展开的导航栏的高度?
最佳答案
一年后遇到了我自己的问题。另一个答案没有用,所以我使用了 View 层次结构。
看起来缩小的外观嵌入了一个名为_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/