xcode 如何在SwiftUI中读取ScrollView中项目的位置?

eqzww0vc  于 2023-06-24  发布在  Swift
关注(0)|答案(1)|浏览(91)

我试图做一个活动,其中创建一个滚动视图与对话框列表。我希望用户能够按照他们认为正确的顺序移动这些对话框。我已经对移动/重新排序部分进行了编码。我很难理解如何在滚动视图中读取项目的当前位置。
滚动视图的对话框有两个属性,一个是要在屏幕上显示的文本,另一个是它们在完整对话框中的正确位置。
所以我希望能够查看用户放东西的顺序,看看它是否符合正确的顺序。沿着于
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())
    }
}
e5njpo68

e5njpo681#

这并没有真正回答我的问题,但事实证明,在我的DropDelegate类中,drop事件实际上是重新排列我的数组,所以我需要做的就是读取我发布的数组,其中包含我的项目,并且它们是用户放置它们的当前顺序。然后,我可以运行一个检查,对数组的索引和正确的位置标记在我的对话对象

相关问题