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,它似乎适用于Button
s,但不适用于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 中的点击问题的主要内容,如果未能解决你的问题,请参考以下文章