Изменить вид внутри ForEach в SwiftUI

Я попытался обновить позицию одного элемента в ForEach. Я хочу вытащить только один элемент из массива в ForEach. Остальное должно остаться прежним. Я пробовал несколько разных способов и всегда получал, что все элементы перетаскивались или вообще не было элементов.

Я очень расстроен на этом этапе, поэтому был бы более чем счастлив, если бы вы мне помогли! Если вам нужна дополнительная информация, не стесняйтесь спрашивать, я новичок в stackOverflow.

      struct ContentView: View {

    var texts: [String] = ["Test1", "Test2"]

    @State var positon: CGSize = .zero

    var body: some View {
        HStack {
            ForEach(texts, id: \.self) { text in
                Text(text)
                    .offset(y: positon.height)
                    .gesture(
                        DragGesture()
                            .onChanged { value in
                                positon = value.translation
                            }
                            .onEnded { value in
                                positon = .zero
                            }
                    )
            }
        }
    }
}

2 ответа

Вы меняете значение position

который используется одинаково для обоих представлений.

Вам понадобится отдельная переменная @State для каждого представления, если вы хотите, чтобы они двигались независимо, или какой-либо другой способ отслеживать их положение отдельно.

Оба представления перетаскиваются одновременно, потому что оба Text взгляды offset(y: ...) зависеть от того же position Переменная.


Примерно так должно работать:

      struct ContentView: View {

    var texts: [String] = ["Test1", "Test2"]

    var body: some View {
        HStack {
            ForEach(texts, id: \.self) { text in
                DraggableText(text: text)
            }
        }
    }
}

struct DraggableText: View {

    var text: String

    @State var position: CGSize = .zero

    var body: some View {
        Text(text)
            .offset(y: position.height)
            .gesture(
                DragGesture()
                    .onChanged { value in
                        position = value.translation
                    }
                    .onEnded { value in
                        position = .zero
                    }
            )
    }
}

Каждый DraggableText имеет собственное свойство позиции.

Другие вопросы по тегам