当前位置: 首页 > 面试题库 >

在SwiftUI中以编程方式检测Tab栏或TabView的高度

栾耀
2023-03-14
问题内容

我有一个SwiftUI应用程序,它将具有一个浮动播客播放器,类似于位于选项卡栏上方的Apple
Music播放器,并且在播放器运行时在所有选项卡和视图中均保持不变。我还没有找到一种好的方法来放置播放器,使其处于Tab栏上方,因为Tab栏的高度随设备而异。我发现的主要问题是如何将播放器放置在应用程序根视图中的叠加层或ZStack中,而不是在TabView本身中。由于我们无法自定义TabView布局的视图层次结构,因此无法在TabBar本身及其上方的视图内容之间注入视图。我的基本代码结构:

TabView(selection: $appState.selectedTab){
  Home()
  .tabItem {
    VStack {
        Image(systemName: "house")
        Text("Home")
    }
  }
  ...
}.overlay(
  VStack {
    if(audioPlayer.isShowing) {
      Spacer()
      PlayerContainerView(player: audioPlayer.player)
      .padding(.bottom, 58)
      .transition(.moveAndFade)
    }
  })

这里的主要问题是PlayerContainerView的位置是硬编码的,填充为58,以便清除TabView。如果我可以检测到TabView的实际框架高度,则可以针对给定设备进行全局调整,这样就可以了。有人知道如何可靠地做到这一点吗?还是您有任何想法如何将PlayerContainerView放置在TabView本身内,以便在切换显示时仅显示在Home()视图和Tab栏之间?对于任何反馈,我们都表示感谢。


问题答案:

由于正式允许并记录了与UIKit的桥梁,因此可以在需要时从那里读取所需的信息。

这是直接从中读取标签栏高度的可能方法 UITabBar

// Helper bridge to UIViewController to access enclosing UITabBarController
// and thus its UITabBar
struct TabBarAccessor: UIViewControllerRepresentable {
    var callback: (UITabBar) -> Void
    private let proxyController = ViewController()

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

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

    typealias UIViewControllerType = UIViewController

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

        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            if let tabBar = self.tabBarController {
                self.callback(tabBar.tabBar)
            }
        }
    }
}

// Demo SwiftUI view of usage
struct TestTabBar: View {
    var body: some View {
        TabView {
            Text("First View")
                .background(TabBarAccessor { tabBar in
                    print(">> TabBar height: \(tabBar.bounds.height)")
                    // !! use as needed, in calculations, @State, etc.
                })
                .tabItem { Image(systemName: "1.circle") }
                .tag(0)
            Text("Second View")
                .tabItem { Image(systemName: "2.circle") }
                .tag(1)
        }
    }
}


 类似资料:
  • 问题内容: 我知道更多视图控制器(导航栏)的存在将UIView按其高度向下推。我也知道这个高度= 44px。我还发现,这种下推保持了。 因此,除了将其设置为常数之外,如何确定此导航栏的高度? 或者,较短的版本,如何确定我的UIView显示在导航栏的顶部? 灯泡开始点亮。不幸的是,如下所述,我还没有发现纠正问题的统一方法。 我相信我的整个问题都围绕着我的自动调整大小掩码。我得出的结论是,无论是否使用

  • 我能够从照片中捕捉颜色的RGB值,但我希望能够通过编程检测该颜色是红色、橙色、黄色、绿色、蓝色、紫色、棕褐色还是白色或黑色。 所以我需要指定返回的RGB范围,例如,红色的值。。。或者蓝色。。。等等我现在有类似的东西,但它不包括所有可能的RGB品种。 红色 R=255,克 R=255,G=0,B 橙色 R=255,克 R=240,G=255,B=0 等等 有人知道如何获取任何RGB值,并检测它是红色

  • 问题内容: 在我看来,Apple鼓励我们放弃在SwiftUI中使用,但如果不使用视图控件,我会觉得有些无能为力。我想要的是能够实现某种将事件发送给的功能。 ViewModel : 查看 : 使用SwiftUI,我不知道如何实现以下功能: 如果登录成功,则推送另一个控制器 如果发生错误,则显示警报 此外,对于任何关于如何以更好的方式实现我想要的东西的建议,我也将不胜感激。谢谢。 更新1: 我能够显示

  • 问题内容: 我找不到有关使用SwiftUI 以* 编程 方式 弹出 或 关闭 所显示视图的任何方式的任何参考。 * 在我看来,唯一的方法是对模式使用已经集成的幻灯片dow操作(以及是否/如何禁用此功能?),以及对导航堆栈使用后退按钮。 有人知道解决方案吗?您知道这是一个错误还是会一直保持这种状态? 问题答案: 本示例使用Beta 5版本说明中记录的新环境var,该环境使用了value属性。在更高的

  • 问题内容: 我一直在寻找这种解决方案已有一段时间,但是没有任何解决方案。例如一个解决方案是 此代码将添加带有“停止”图像的按钮。就像这样,还有其他解决方案,例如“搜索,刷新”等。但是 ,如果我想以编程方式在想要的图像上添加按钮,该怎么办? 问题答案: 自定义按钮图片,未设置按钮框: 您可以使用指定的图像和其他属性来初始化新项目。 检查此Apple文档。参考 UIBarButtonItem具有使用按

  • 问题内容: 我将C#与SMO一起使用,并尝试检测要连接到的SQL Server版本(例如,企业版,标准版)。我知道如何获取版本信息,但这只能告诉我SQL Server的版本(例如,SQL Server 2008与SQL Server 2005)。 有谁知道如何获得实际的产品版本(例如,企业版,标准版)? 我需要此信息,因为某些SQL Server功能只是企业级的。因此,我可以尝试调用它们并捕获异常