SwiftUI'de sağ tıklamayı nasıl tespit edebilirim?


10

Ben yazıyorum basit Maden app bana SwiftUI tanımak yardımcı olur. Bu nedenle, birincil tıklamanın (genellikle LMB) "kazmak" (orada mayın olup olmadığını ortaya çıkarmak) ve ikincil tıklamayı (genellikle RMB) bir bayrak yerleştirmek istiyorum.

Kazma işim var! Ancak bir bayrağın nasıl yerleştirileceğini anlayamıyorum, çünkü ikincil bir tıklamanın nasıl tespit edileceğini bulamıyorum.

İşte ne çalışıyorum :

BoardSquareView(
    style: self.style(for: square),
    model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.gesture(TapGesture().onEnded(self.handleUserDidTap(square)))

Daha önce ima ettiğim gibi, döndürülen işlev handleUserDidTaptıklama sırasında düzgün bir şekilde çağrılır, ancak döndürülen işlev handleUserDidAltTapyalnızca Kontrol tuşunu basılı tuttuğumda çağrılır. Bu mantıklı çünkü kod ne diyor ... ama ikincil tıklama kayıt yapabilirsiniz herhangi bir API görmüyorum, bu yüzden başka ne yapacağımı bilmiyorum.

Bunu da denedim, ancak davranış aynı görünüyordu:

BoardSquareView(
    style: self.style(for: square),
    model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.onTapGesture(self.handleUserDidTap(square))

1
İlk bağlantınız koptu. Özel repo mu?
Gil Birman

.onTapGesture() bunu kontrol et.
Raymond

Hata! Haklısın @GilBirman! Sabit; bunun için üzgünüm
Ben Leggiero

@Raymond Önce denedim. Büyük bir şey kaçırmadıkça, aynı şekilde davranıyor gibi görünüyor.gesture(TapGesture().onEnded(.......))
Ben Leggiero

Yanıtlar:


4

Şu anda SwiftUI'de işler dururken, bu doğrudan mümkün değil. Gelecekte olacağından eminim, ancak şu anda, TapGestureaçıkça "sağ tıklama" kavramına sahip olmayan iOS kullanım örneklerine odaklanıyor, bu yüzden bunun göz ardı edildiğini düşünüyorum. "Uzun basın" kavramının birinci sınıf bir vatandaş LongPressGestureolduğunu ve neredeyse sadece bu teoriyi destekleyen bir iOS bağlamında kullanıldığına dikkat edin.

Bununla birlikte, bu işi yapmanın bir yolunu buldum. Yapmanız gereken eski teknolojiye geri dönmek ve SwiftUI görünümünüze yerleştirmektir.

struct RightClickableSwiftUIView: NSViewRepresentable {
    func updateNSView(_ nsView: RightClickableView, context: NSViewRepresentableContext<RightClickableSwiftUIView>) {
        print("Update")
    }

    func makeNSView(context: Context) -> RightClickableView {
        RightClickableView()
    }

}

class RightClickableView : NSView {
    override func mouseDown(with theEvent: NSEvent) {
        print("left mouse")
    }

    override func rightMouseDown(with theEvent: NSEvent) {
        print("right mouse")
    }
}

Bunu test ettim ve oldukça karmaşık bir SwiftUI uygulamasında benim için çalıştı. Buradaki temel yaklaşım:

  1. Dinleme bileşeninizi bir NSView.
  2. Uygulayan bir SwiftUI görünümü ile sarın NSViewRepresentable.
  3. Uygulamanızı, tıpkı diğer SwiftUI görünümlerinde yaptığınız gibi, istediğiniz yerde kullanıcı arayüzüne yerleştirin.

İdeal bir çözüm değil, ancak şu an için yeterince iyi olabilir. Umarız Apple SwiftUI'nin yeteneklerini daha da genişletene kadar sorununuzu çözer.


Teşekkür ederim. Temelde şimdilik bunu yapıyordum . Bu onların çerçeve ile ilgili ilk izlenim olduğu için gerçekten üzücü. Daha iyi bir çözüm gelene kadar (umarım 🤞🏼) kabul edilmiş olarak işaretlerim
Ben Leggiero

1
Welp; Bu bugünkü en iyi cevap gibi görünüyor. Ödül senin! Umarım bir gün resmi bir çözümümüz olur.
Ben Leggiero
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.