Voj*_*jto 6 macos swift swiftui
考虑 SwiftUI 中的这个视图:
struct MyView: View {
var body: some View {
Rectangle()
.fill(Color.blue)
.frame(width: 200, height: 200)
.onTapGesture {
print("single clicked")
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们正在处理单击。假设你也想处理双击,但有一个单独的回调。
您有 2 个选择:
struct MyView: View {
var body: some View {
Rectangle()
.fill(Color.blue)
.frame(width: 200, height: 200)
.onTapGesture(count: 2) {
print("double clicked")
}
.onTapGesture {
print("single clicked")
}
}
}
Run Code Online (Sandbox Code Playgroud)
双击处理程序被正确调用,但单击处理程序在大约 250 毫秒的延迟后被调用。
任何想法如何解决这个问题?
这是可能的方法(使用 Xcode 11.2 / macOS 10.15 测试)
struct MyView: View {
var body: some View {
Rectangle()
.fill(Color.blue)
.frame(width: 200, height: 200)
.gesture(TapGesture(count: 2).onEnded {
print("double clicked")
})
.simultaneousGesture(TapGesture().onEnded {
print("single clicked")
})
}
}
Run Code Online (Sandbox Code Playgroud)
selection在列表上启用时,基于手势的解决方案无法正常工作,因为第一次点击会延迟实际选择。我制作了一个双击修改器,它适用于任何视图,并且似乎在所有情况下都能以我期望的方式解决它:
extension View {
/// Adds a double click handler this view (macOS only)
///
/// Example
/// ```
/// Text("Hello")
/// .onDoubleClick { print("Double click detected") }
/// ```
/// - Parameters:
/// - handler: Block invoked when a double click is detected
func onDoubleClick(handler: @escaping () -> Void) -> some View {
modifier(DoubleClickHandler(handler: handler))
}
}
struct DoubleClickHandler: ViewModifier {
let handler: () -> Void
func body(content: Content) -> some View {
content.overlay {
DoubleClickListeningViewRepresentable(handler: handler)
}
}
}
struct DoubleClickListeningViewRepresentable: NSViewRepresentable {
let handler: () -> Void
func makeNSView(context: Context) -> DoubleClickListeningView {
DoubleClickListeningView(handler: handler)
}
func updateNSView(_ nsView: DoubleClickListeningView, context: Context) {}
}
class DoubleClickListeningView: NSView {
let handler: () -> Void
init(handler: @escaping () -> Void) {
self.handler = handler
super.init(frame: .zero)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func mouseDown(with event: NSEvent) {
super.mouseDown(with: event)
if event.clickCount == 2 {
handler()
}
}
}
Run Code Online (Sandbox Code Playgroud)
https://gist.github.com/joelekstrom/91dad79ebdba409556dce663d28e8297
| 归档时间: |
|
| 查看次数: |
1459 次 |
| 最近记录: |