【问题标题】:SwiftUI: How can I restrict the tappable area of a view when presenting a modal(actually not modal) view over a main view?SwiftUI:在主视图上呈现模态(实际上不是模态)视图时,如何限制视图的可点击区域?
【发布时间】:2020-05-23 09:19:26
【问题描述】:

我正在开发一个基于具有三个 TabItem 的 Tabview 的应用程序。每个 TabItem 都是一个列表,我将能够在这些列表上显示一种模式视图。当我无法将工作表称为模态视图时,问题就出现了,因为工作表几乎是全窗口的。我需要某种底部模式视图,因此我创建了一个视图,该视图呈现在具有更高 ZIndex 的列表上。在您单击选项卡栏并选择另一个已部署“模态”视图的 TabItem 之前,它似乎可以工作。错误是:

[TableView] 仅警告一次:UITableView 被告知布局其 可见单元格和其他内容,而不在视图层次结构中 (表视图或其超级视图之一尚未添加到 窗户)。这可能会通过强制表视图中的视图来导致错误 在没有准确信息的情况下加载和执行布局(例如表格视图 边界、特征集合、布局边距、安全区域插入等),以及 由于额外的布局也会导致不必要的性能开销 通过。

因此,我想将可点击区域限制为“模态”视图区域的解决方案。 ¿ 有没有办法做到这一点?

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

    您可能有一些条件状态,具体取决于您呈现“模态”视图的方式,因此根据相同的条件,您可以在 TabView 下方禁用,如下所示

    TabView {
    // ... tabs content here
    }.disabled(showingModal)
    

    更新:这是我的意思的方法演示(使用 Xcode 11.3+ 测试)

    struct TestTabViewModal: View {
        @State private var selectedTab = 0
        @State private var modalShown = false
        var body: some View {
            ZStack {
                TabView(selection: $selectedTab) {
                    VStack {
                        Button("Show Modal") { self.modalShown = true }
                            .padding(.top, 40)
                        Spacer()
                    }
                    .tabItem {
                        Image(systemName: "1.circle")
                    }.tag(0)
    
                    Text("2").tabItem {
                        Image(systemName: "1.circle")
                    }.tag(1)
                }.disabled(modalShown)
    
                if modalShown {
                    RoundedRectangle(cornerRadius: 10)
                        .fill(Color.yellow)
                        .frame(width: 320, height: 240)
                        .overlay(Button("CloseMe") { self.modalShown = false })
                }
            }
        }
    }
    

    【讨论】:

    • 嗨 Asperi,问题是 disabled() 会阻塞整个屏幕,甚至是“模态”视图。感谢您的分道扬镳。
    • @AndoniDaSilva,我添加了演示更新。
    • 感谢 Asperi,现在我将“模态”视图从 TabItem 子视图中取出,现在可以正常工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 2012-12-03
    • 1970-01-01
    相关资源
    最近更新 更多