Я пытаюсь реализовать несколько жестов на моем Uiview. Большую часть времени он работает хорошо, за исключением случая для Longpressgesture .
, когда он обнаруживает Longpressgesture , и, хотя прикосновение все еще находится на пользовательском интерфейсе, он больше не может обнаружить другие жесты (например, нажимать на другую область). Можно ли иметь функции с несколькими ударами? Я заметил SpatialeventSture в iOS18, но мне нужно поддерживать более ранние версии iOS, и это не хороший выбор для меня.// CustomUIView
var body: some View {
Color.purple.opacity(0.8)
.frame(width: frame.width, height: frame.height)
.offset(x: offset.x, y: offset.y)
.contentShape(Rectangle())
.gesture(
DragGesture(minimumDistance: 0)
.onChanged { value in
// Convert gesture location from local to global coords
let globalLocation = CGPoint(x: value.location.x + offset.x,
y: value.location.y + offset.y)
handleDragChanged(value, globalLocation: globalLocation)
}
.onEnded { value in
let globalLocation = CGPoint(x: value.location.x + offset.x,
y: value.location.y + offset.y)
handleDragEnded(value, globalLocation: globalLocation)
}
)
}
< /code>
Логика для обработки события: < /p>
private func handleDragChanged(_ value: DragGesture.Value, globalLocation: CGPoint) {
// Use globalLocation for hit testing against noteRects
if touchStartTime == nil {
touchStartTime = Date()
touchStartLocation = value.startLocation
let workItem = DispatchWorkItem {
isLongPressActive = true
}
longPressWorkItem = workItem
DispatchQueue.main.asyncAfter(deadline: .now() + longPressDuration, execute: workItem)
} else if let startLoc = touchStartLocation {
let distance = hypot(value.location.x - startLoc.x, value.location.y - startLoc.y)
if distance > movementThreshold {
longPressWorkItem?.cancel()
longPressWorkItem = nil
if isLongPressActive {
handleDrag(atGlobalLocation: globalLocation)
}
}
}
if !isLongPressActive {
handleDrag(atGlobalLocation: globalLocation)
}
dragLocation = value.location
}
private func handleDragEnded(_ value: DragGesture.Value, globalLocation: CGPoint) {
longPressWorkItem?.cancel()
longPressWorkItem = nil
if isLongPressActive {
// do sth
isLongPressActive = false
longPressNoteIndex = nil
} else {
handleTap(atGlobalLocation: globalLocation)
}
dragLocation = nil
touchStartTime = nil
touchStartLocation = nil
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... on-swiftui