Удалить вид при перетаскивании в другой вид в SwiftUI - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть массив Views в родительском View в SwiftUI. Каждый из этих видов в массиве имеет жест перетаскивания, который позволяет мне перемещать их по экрану по отдельности.

У меня также есть другой вид в родительском виде, напоминающий значок корзины.

Когда я перетаскиваю один из моих массивов видов в пространство корзины, как я могу удалить этот перетаскиваемый вид из массива, чтобы он эффективно «удалялся» с экрана?

Это тот же вопрос, что и здесь, но я ищу решение SwiftUI вместо obj- c: Удаление UILabel при перетаскивании на изображение

Редактировать: Это то, что код выглядит следующим образом:

Родительский вид:

struct parentView: View {

    @State var childViews: [ChildView]

    var body: some View {

        ForEach(self.childViews, id: \.childId) { childView in
            childView
        }
        .overlay(
            DeleteIcon()
                .padding(.top, 200)
        )

    }
}

Дочерний вид (их несколько):

struct ChildView: View {

    let childId = UUID()

    // dragging vars
    @State private var currentPosition: CGSize = .zero
    @State private var newPosition: CGSize = .zero

    var dragGesture: some Gesture {
        DragGesture()
            .onChanged { value in
                self.currentPosition = CGSize(width: value.translation.width + self.newPosition.width, height: value.translation.height + self.newPosition.height)
            }
            .onEnded { value in
                self.currentPosition = CGSize(width: value.translation.width + self.newPosition.width, height: value.translation.height + self.newPosition.height)
                self.newPosition = self.currentPosition
            }
    }


    var body: some View {
        Rectangle()
            .fill(Color.blue)
            .frame(width: 200, height: 200)
            .offset(x: currentPosition.width, y: currentPosition.height)
            .gesture(dragGesture)

    }
}

Значок удаления:

struct DeleteIcon: View {
    var body: some View {
        Rectangle()
            .fill(Color.red)
            .frame(width: 50, height: 200)
    }
}

1 Ответ

1 голос
/ 17 апреля 2020

Я сделал очень простой и грубый тест, где перетаскивание к левому краю экрана «удалит» круг. Чтобы «удалить» с экрана, я использовал var «showMe» и EmptyView. По сути, я просто заменяю представление пустым.

import SwiftUI

struct ContentView: View {
var body: some View {
    Group {
        DragThing(pos: CGPoint(x:111,y:111), name: "test1")
        DragThing(pos: CGPoint(x:133,y:133), name: "test2")
        DragThing(pos: CGPoint(x:166,y:166), name: "test3")
    }
}
}

struct DragThing: View {

@State private var pos = CGPoint.zero
@State private var name = ""
@State private var showMe = true

init(pos: CGPoint, name: String) {
    _pos = State(initialValue: pos)
    _name = State(initialValue: name)
}

var body: some View {
    showMe ?
        AnyView(ZStack {
            Circle().foregroundColor(.blue).frame(width: 100, height: 100)
            Text(self.name).foregroundColor(.white)
        }.position(self.pos).highPriorityGesture(self.drag))
        : AnyView(EmptyView())
}

var drag: some Gesture {
    DragGesture().onChanged { value in
        self.pos = CGPoint(x: value.location.x, y: value.location.y)
        if self.pos.x < 40 {
            self.showMe = false
        }
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...