Проблемы с щелчком в SwiftUI Catalyst с помощью Big Sur

#swiftui #mac-catalyst

#swiftui #mac-catalyst

Вопрос:

Я только что обновился до 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
    }
}
  

Если вы начнете нажимать на панель вкладок внизу, это сработает. Если вы продолжите нажимать на вкладки вверху, это тоже сработает. Но после нажатия на поддельные вкладки вверху вы больше не можете нажимать на панель вкладок внизу.

Кто-нибудь еще испытывает эту проблему? Это ошибка Big Sur?

Редактировать

Он отлично работает в симуляторе на iPadOS.

Комментарии:

1. Я испытываю точно то же самое. FWIW, кажется, что это работает с Button s, но нет onTapGesture . Вы нашли какие-либо решения?

2. Кажется, это полная катастрофа, два года спустя…

Ответ №1:

Это, безусловно, серьезная проблема. Также сообщается здесь https://developer.apple.com/forums/thread/667004

Я бы хотел, чтобы Apple это признала.

Ответ №2:

Я сталкиваюсь с довольно похожими проблемами. У меня также есть HStack в качестве основного представления. В каждой строке есть кнопки и текстовые поля. Когда кнопки добавления / удаления столбцов перестают работать, а выделенные текстовые поля больше не могут быть изменены щелчками мыши (щелчки правой кнопкой мыши все еще работают). Также наблюдаются нерабочие кнопки в ZStacks. Все еще выясняю сценарий проблемы, чтобы воспроизвести его надежно. Может быть что-то с HStack, поскольку мы оба их используем.

Комментарии:

1. Честно говоря, я перестал расследовать и тратить на это время. Catalyst и SwiftUI ужасны и глючны. Я скопировал свой код и создал собственное приложение для Mac с помощью AppKit. Намного лучше и заняло у меня всего один день благодаря SwiftUI.

2. Я такой же, как вы, ребята. Catalyst SwiftUI на Big Surf — это мусор, если вы укажете «Оптимизировать интерфейс на Mac», работает немного лучше, но все еще довольно глючно. Я согласен с lupurus, вернитесь к Catalina или сделайте ее родной для Mac.

Ответ №3:

Мои эксперименты показывают, что это как-то связано с тем, имеет ли область обнаружения попадания видимый фон. См 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)
        }
    }
}