首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SwiftUI NavigationBar高度

SwiftUI NavigationBar高度
EN

Stack Overflow用户
提问于 2020-02-15 17:56:44
回答 3查看 12.5K关注 0票数 7

如何获得当前的NavigationBar高度?在UIKit我们可以得到

代码语言:javascript
运行
复制
navigationController?.navigationBar.frame.height

但是找不到SwiftUI的任何东西..。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-17 09:08:55

基于这篇文章(感谢Asperi):https://stackoverflow.com/a/59972635/12299030

代码语言:javascript
运行
复制
struct NavBarAccessor: UIViewControllerRepresentable {
    var callback: (UINavigationBar) -> Void
    private let proxyController = ViewController()

    func makeUIViewController(context: UIViewControllerRepresentableContext<NavBarAccessor>) ->
                              UIViewController {
        proxyController.callback = callback
        return proxyController
    }

    func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<NavBarAccessor>) {
    }

    typealias UIViewControllerType = UIViewController

    private class ViewController: UIViewController {
        var callback: (UINavigationBar) -> Void = { _ in }

        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            if let navBar = self.navigationController {
                self.callback(navBar.navigationBar)
            }
        }
    }
}

然后我们可以从任何角度称之为:

代码语言:javascript
运行
复制
.background(NavBarAccessor { navBar in
      print(">> NavBar height: \(navBar.bounds.height)")
                // !! use as needed, in calculations, @State, etc.
 })
票数 22
EN

Stack Overflow用户

发布于 2021-06-02 22:21:14

根据@yoprst的响应,而不是配置计算和@State变量,还可以返回一个View直接插入到层次结构中:

代码语言:javascript
运行
复制
struct NavigationBarAccessor: UIViewControllerRepresentable {
    var callback: (UINavigationBar) -> (AnyView)
    private let proxyViewController = ProxyViewController()

    func makeUIViewController(context: UIViewControllerRepresentableContext<NavigationBarAccessor>) -> UIViewController {
        self.proxyViewController.callback = callback
        return proxyViewController
    }

    func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<NavigationBarAccessor>) {
    }

    private class ProxyViewController: UIViewController {
        var callback: ((UINavigationBar) -> AnyView)?

        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            if let navigationBar = self.navigationController?.navigationBar {
                _ = self.callback?(navigationBar)
            }
        }
    }
}

用法:

代码语言:javascript
运行
复制
VStack {
    NavigationBarAccessor { navigationBar in
        Spacer()
            .frame(height: navigationBar.frame.height)
    }
}
票数 2
EN

Stack Overflow用户

发布于 2021-10-18 14:04:10

使用GeometryReader,如下所示:

代码语言:javascript
运行
复制
ZStack {
    GeometryReader { geometry in
        Rectangle().fill(Color.blue).frame(height: geometry.safeAreaInsets.bottom + 44.0)
    }
    Text("Content")
}
.edgesIgnoringSafeArea(.top)
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60241552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档