Я создаю представление SwiftUI с перетаскиваемыми элементами, организованными в 2D-массив (массив массивов). Я хочу разрешить перемещение элементов между строками во время перетаскивания, в частности, перемещение элемента в середине жеста, когда перетаскивание достигает определенного порога. Однако я столкнулся с проблемой, когда последний элемент в каждой строке перестает реагировать на DragGesture, особенно при попытке переместить его в другую строку. Эта проблема не возникает для других элементов в строке, только для последнего.
Дополнительный контекст
Мой Настоящее приложение намного сложнее, но я создал этот минимальный пример, в котором я могу воспроизвести проблему. В реальном приложении я не использую вспомогательные флаги, такие как doItOnce, и упростил этот код, чтобы проиллюстрировать основную проблему. Интересно, что если я перемещаю элементы только в пределах одной строки (например, меняю позиции), жест и движение работают без проблем. Все это происходит в iOS 18.1; В настоящее время я загружаю и другие версии симулятора, чтобы протестировать их. Я не могу использовать .draggable, потому что мое приложение более сложное и требует, чтобы жест запускался немедленно, без длительного нажатия на представление.
Описание проблемы
Приведенный выше код работает должным образом для всех элементов, кроме последнего элемента в каждой строке. Когда я пытаюсь перетащить последний элемент в строке и пересечь порог, жест перетаскивания перестает реагировать, и я больше не могу переместить элемент в другую строку. Для других элементов все работает нормально, и они правильно перемещаются в середине жеста.
Вопрос
Почему DragGesture .onChanged перестает отвечать на последний элемент в каждой строке, и как я могу включить плавное движение в середине жеста без его прекращения? Существует ли рекомендуемый способ обработки перемещения элементов между строками в середине жеста 2D-массива в SwiftUI?
Будем очень признательны за любые предложения или решения!
Видео на YouTube
import SwiftUI
struct Item: Identifiable {
let text: String
let id = UUID()
}
struct DragBugView: View {
@State var array2d: [[Item]] = [
[.init(text: "1"), .init(text: "2"), .init(text: "3")],
[.init(text: "4"), .init(text: "5"), .init(text: "6")],
]
@State var doItOnce = true
@State var translationHeight: CGFloat = 0
var body: some View {
VStack {
Text("Dragging translation value: \n \(translationHeight)")
ForEach(array2d.indices, id: \.self) { i in
HStack {
ForEach(array2d.indices, id: \.self) { j in
Text(array2d[j].text)
.padding()
.background(Color.green)
.gesture(
DragGesture(coordinateSpace: .global)
.onChanged({ value in
translationHeight = value.translation.height
if value.translation.height > 200 && doItOnce {
let temp = array2d.remove(at: j)
array2d[0].insert(temp, at: 0)
doItOnce = false
}
})
.onEnded({ value in
doItOnce = true
translationHeight = 0
})
)
}
}
}
}
}
}
#Preview {
DragBugView()
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... row-of-a-2
SwiftUI DragGesture перестает отвечать при удалении последнего элемента в строке среднего жеста 2D-массива ⇐ IOS
Программируем под IOS
1731139823
Anonymous
Я создаю представление SwiftUI с перетаскиваемыми элементами, организованными в 2D-массив (массив массивов). Я хочу разрешить перемещение элементов между строками во время перетаскивания, в частности, перемещение элемента в середине жеста, когда перетаскивание достигает определенного порога. Однако я столкнулся с проблемой, когда последний элемент в каждой строке перестает реагировать на DragGesture, особенно при попытке переместить его в другую строку. Эта проблема не возникает для других элементов в строке, только для последнего.
[b]Дополнительный контекст[/b]
Мой Настоящее приложение намного сложнее, но я создал этот минимальный пример, в котором я могу воспроизвести проблему. В реальном приложении я не использую вспомогательные флаги, такие как doItOnce, и упростил этот код, чтобы проиллюстрировать основную проблему. Интересно, что если я перемещаю элементы только в пределах одной строки (например, меняю позиции), жест и движение работают без проблем. Все это происходит в iOS 18.1; В настоящее время я загружаю и другие версии симулятора, чтобы протестировать их. Я не могу использовать .draggable, потому что мое приложение более сложное и требует, чтобы жест запускался немедленно, без длительного нажатия на представление.
[b]Описание проблемы[/b]
Приведенный выше код работает должным образом для всех элементов, кроме последнего элемента в каждой строке. Когда я пытаюсь перетащить последний элемент в строке и пересечь порог, жест перетаскивания перестает реагировать, и я больше не могу переместить элемент в другую строку. Для других элементов все работает нормально, и они правильно перемещаются в середине жеста.
[b]Вопрос[/b]
Почему DragGesture .onChanged перестает отвечать на последний элемент в каждой строке, и как я могу включить плавное движение в середине жеста без его прекращения? Существует ли рекомендуемый способ обработки перемещения элементов между строками в середине жеста 2D-массива в SwiftUI?
Будем очень признательны за любые предложения или решения!
Видео на YouTube
import SwiftUI
struct Item: Identifiable {
let text: String
let id = UUID()
}
struct DragBugView: View {
@State var array2d: [[Item]] = [
[.init(text: "1"), .init(text: "2"), .init(text: "3")],
[.init(text: "4"), .init(text: "5"), .init(text: "6")],
]
@State var doItOnce = true
@State var translationHeight: CGFloat = 0
var body: some View {
VStack {
Text("Dragging translation value: \n \(translationHeight)")
ForEach(array2d.indices, id: \.self) { i in
HStack {
ForEach(array2d[i].indices, id: \.self) { j in
Text(array2d[i][j].text)
.padding()
.background(Color.green)
.gesture(
DragGesture(coordinateSpace: .global)
.onChanged({ value in
translationHeight = value.translation.height
if value.translation.height > 200 && doItOnce {
let temp = array2d[i].remove(at: j)
array2d[0].insert(temp, at: 0)
doItOnce = false
}
})
.onEnded({ value in
doItOnce = true
translationHeight = 0
})
)
}
}
}
}
}
}
#Preview {
DragBugView()
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79172338/swiftui-draggesture-stops-responding-when-removing-the-last-item-in-a-row-of-a-2[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия