我试图做一个活动,其中创建一个滚动视图与对话框列表。我希望用户能够按照他们认为正确的顺序移动这些对话框。我已经对移动/重新排序部分进行了编码。我很难理解如何在滚动视图中读取项目的当前位置。
滚动视图的对话框有两个属性,一个是要在屏幕上显示的文本,另一个是它们在完整对话框中的正确位置。
所以我希望能够查看用户放东西的顺序,看看它是否符合正确的顺序。沿着于
if currentPosition/IndexOfItemInScrollView!= item.itsCorrectPosition {错误}
这是我目前为止的代码
import SwiftUI
struct LAPutDialogueInOrder: View {
@EnvironmentObject var listeningActivityManager: ListeningActivityManager
@ObservedObject var ListeningActivityQuestionsVM: ListeningActivityQuestionsViewModel
@State var draggingItem: dialogueBox?
@StateObject var LAPutDialogueInOrderVM: LAPutDialogueInOrderViewModel
@State var isUpdating = false
let columns = Array(repeating: GridItem(.flexible(), spacing: 45), count: 1)
var body: some View {
VStack{
ScrollView{
LazyVGrid(columns: columns, spacing: 20, content: {
ForEach(LAPutDialogueInOrderVM.dialogueBoxes){ item in
dialogueBoxView(dialogueText: item.dialogueText)
.frame(width: 300, height: 60)
.background(.teal)
.cornerRadius(10)
.shadow(radius: 10)
.opacity(item.id == draggingItem?.id && isUpdating ? 0.5 : 1) // <- HERE
.onDrag {
draggingItem = item
return NSItemProvider(contentsOf: URL(string: "\(item.id)"))!
}
.onDrop(of: [.item], delegate: DropViewDelegate(currentItem: item, items: $LAPutDialogueInOrderVM.dialogueBoxes, draggingItem: $draggingItem, updating: $isUpdating))
}
}).animation(.default, value: LAPutDialogueInOrderVM.dialogueBoxes)
Button(action: {
}, label: {
Text("test")})
}.scrollDisabled(true)
}
}
}
struct dialogueBoxView: View {
var dialogueText: String
var body: some View {
Text(dialogueText)
.font(Font.custom("Chalkboard SE", size: 12))
.padding([.leading, .trailing], 10)
.multilineTextAlignment(.leading)
}
}
struct LAPutDialogueInOrder_Previews: PreviewProvider {
static let ListeningActivityQuestionsVM = ListeningActivityQuestionsViewModel(dialogueQuestionView: dialogueViewObject(fillInDialogueQuestionElement: ListeningActivityElement.pastaCarbonara.fillInDialogueQuestion))
static let LAPutDialogueInOrderVM = LAPutDialogueInOrderViewModel(dialoguePutInOrderVM: dialoguePutInOrderObj(stringArray: ListeningActivityElement.pastaCarbonara.putInOrderDialogueBoxes[0].fullSentences))
static var previews: some View {
LAPutDialogueInOrder(ListeningActivityQuestionsVM: ListeningActivityQuestionsVM, LAPutDialogueInOrderVM: LAPutDialogueInOrderVM)
.environmentObject(ListeningActivityManager())
}
}
1条答案
按热度按时间e5njpo681#
这并没有真正回答我的问题,但事实证明,在我的DropDelegate类中,drop事件实际上是重新排列我的数组,所以我需要做的就是读取我发布的数组,其中包含我的项目,并且它们是用户放置它们的当前顺序。然后,我可以运行一个检查,对数组的索引和正确的位置标记在我的对话对象