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

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

Сообщение Anonymous »

Я пытаюсь реализовать несколько жестов на моем 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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