Обнаружение нескольких жестов на 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
Ответить

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

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

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

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

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