【问题标题】:Clicking problems in SwiftUI Catalyst with Big SurBig Sur 在 SwiftUI Catalyst 中的点击问题
【发布时间】:2021-02-25 08:24:26
【问题描述】:

我刚刚更新到 Big Sur,现在我的 Catalyst 应用程序遇到了严重的问题。我用类似的代码创建了一个新项目来测试它。行为有点不同,但在这两种情况下,都有一点,点击停止工作,或者至少不再可靠。

以这个示例代码为例:

struct ContentView: View {
        
    private var tabs = ["tab1", "tab2", "tab3"]
    @State private var selectedTab = 0
    
    var body: some View {
        VStack {
            
            self.fakeTabs()
            
            self.tabView()
            
        }
    }
    
    private func fakeTabs() -> some View {
        HStack(spacing: 0) {
            
            // ========================================================
            // Tabs
            // ========================================================
            ForEach(self.tabs, id: \.self) { tab in
                ZStack {
                    // background
                    Rectangle()
                        .fill(self.isSelected(tab: tab) ? Color.blue : Color.green)
                        .border(Color.black, width: 1)
                        .contentShape(Rectangle())
                    // icon
                    HStack(spacing: 15.0) {
                        Image(systemName: "folder")
                            .foregroundColor(.white)
                            .frame(width: 20, height: 20)
                        Text(tab)
                            .font(.caption)
                    }
                }
                .onTapGesture {
                    self.selectedTab = self.tabs.firstIndex(where: { $0 == tab }) ?? 0
                }
            }
        }
        .frame(height: 30)
    }
    
    private func tabView() -> some View {
        TabView(selection: self.$selectedTab) {
            
            ForEach(self.tabs.indices) { index in
                
                let tab = self.tabs[index]
                
                Text("Tab selected: \(tab)")
                    .tabItem { Text(tab) }
                    .tag(index)
                
            }
        }
    }
    
    private func isSelected(tab: String) -> Bool {
        if let index = self.tabs.firstIndex(where: { $0 == tab }) {
            if index == self.selectedTab {
                return true
            }
        }
        return false
    }
}

如果您开始单击底部的标签栏,它会起作用。如果您然后继续单击顶部的选项卡,它也可以工作。但是点击顶部的假标签后,就不能再点击底部的TabBar了。

其他人是否遇到过这个问题?是 Big Sur 的错误吗?

编辑

它在 iPadOS 上的模拟器中完美运行。

【问题讨论】:

  • 我正在经历同样的事情。 FWIW,它似乎适用于Buttons,但不适用于onTapGesture。你找到解决办法了吗?

标签: swiftui mac-catalyst


【解决方案1】:

我的实验表明它与命中检测区域是否具有可见背景有关。请参阅下面的KLUDGE 备注。

struct Application {
    // ...

    static let isCatalyst: Bool = {
    #if targetEnvironment(macCatalyst)
        true
    #else
        false
    #endif
    }()

    // ... 
}

struct TopBar<L, T>: ViewModifier where L: View, T: View {
    let leading: L
    let trailing: T

    func body(content: Content) -> some View {
        VStack {
            HStack {
                leading
                Spacer()
                trailing
            }
            .frame(maxWidth: .infinity)
            .padding()
            // KLUDGE: For some reason under Big Sur, Catalyst Buttons are sometimes
            // very hard to hit if they don't have a visible background.
            // This seems to work around the problem.
            .background(Application.isCatalyst ? Color.secondary.opacity(0.1) : Color.clear)

            content
                .frame(maxHeight: .infinity)
        }
    }
}

【讨论】:

    【解决方案2】:

    这绝对是个大问题。也在这里报道https://developer.apple.com/forums/thread/667004

    我希望 Apple 承认这一点。

    【讨论】:

      【解决方案3】:

      我面临着类似的问题。我也有一个 HStack 作为主视图。在每一行中都有按钮和文本字段。添加/删除列时,按钮停止工作,并且无法再通过单击更改焦点文本字段(右键单击仍然有效)。 还观察到 ZStacks 中的非工作按钮。仍在找出问题场景以可靠地重现它。可能与 HStack 有关,因为我们都使用它们。

      【讨论】:

      • 老实说,我停止调查并为此浪费时间。 Catalyst 和 SwiftUI 是可怕的和错误的。我复制了我的代码并使用 AppKit 制作了一个原生 Mac 应用程序。多亏了 SwiftUI,好多了,我只花了一天时间。
      • 我和你们一样。 Big Surf 上的 Catalyst SwiftUI 是垃圾,如果你把“在 Mac 上优化界面”工作得更好一点,但仍然有很多错误。我同意 lupurus,回到 Catalina 或者让它原生于 Mac。
      猜你喜欢
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 2021-04-15
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 2021-03-17
      相关资源
      最近更新 更多