SwiftUI DragGesture перестает отвечать при удалении последнего элемента в строке среднего жеста 2D-массиваIOS

Программируем под IOS
Ответить
Anonymous
 SwiftUI DragGesture перестает отвечать при удалении последнего элемента в строке среднего жеста 2D-массива

Сообщение Anonymous »

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

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

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

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

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

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