Big Sur 在 SwiftUI Catalyst 中的点击问题

Posted

技术标签:

【中文标题】Big Sur 在 SwiftUI Catalyst 中的点击问题【英文标题】:Clicking problems in SwiftUI Catalyst with Big Sur 【发布时间】: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。你找到解决办法了吗? 【参考方案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。

以上是关于Big Sur 在 SwiftUI Catalyst 中的点击问题的主要内容,如果未能解决你的问题,请参考以下文章

聊聊 macOS Big Sur

安装MacOS Big Sur的艰苦历程

在 Mac Big Sur 中安装 mongodb 失败

macOS Big Sur 安装到虚拟机

在 macOS Big Sur 上安装可可豆荚时出错

(原版镜像)macOS Big Sur Beta 7