Обнаружение нескольких жестов на SwiftuiIOS

Программируем под IOS
Anonymous
Обнаружение нескольких жестов на Swiftui

Сообщение Anonymous »

Я пытаюсь реализовать несколько жестов на моем Uiview. Большую часть времени он работает хорошо, за исключением случая для 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
< /code>
} < /p>
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

Вернуться в «IOS»