Я пытаюсь реализовать несколько жестов на моем 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
Обнаружить несколько жестов на Swiftui ⇐ IOS
Программируем под IOS
1752507104
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
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79700612/detect-multiple-gestures-on-swiftui[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия