首页 > 解决方案 > SwiftUI Carousel 中的自定义拖动手势

问题描述

我想创建一个自定义轮播(将来是一个快速轮播)。我尝试使用拖动手势,但每次拖动它时,它都会先返回 0,然后再拖动视图。我试图将statementpoint值添加到计算中,最终总是从500 ish开始

有没有其他方法可以做到这一点?如果没有,我该怎么做?

struct ScrollItem: View {
    @Binding var offset:CGFloat
    var body: some View {
        HStack(spacing:10){
            ForEach(0..<7){_ in
                RoundedRectangle(cornerRadius: 10)
                    .frame(width: 200, height: 150, alignment: .center
            }
        }
        .offset(x:offset)
        .gesture(
            DragGesture()
                .onChanged({ val in
                    let startLoc = val.startLocation
                    self.offset = val.translation.width + startLoc.x // + startLoc.x
                })
                .onEnded({ val in
                  self.offset = val.translation.width
                })
        )
        .animation(.easeInOut)
    }
}

标签: swiftswiftui

解决方案


您需要跟踪最后的偏移量。


struct ContentView: View {
    @Binding var offset:CGFloat = .zero
    @State var lastOffset: CGFloat = .zero
    var body: some View {
        HStack(spacing:10){
            ForEach(0..<7){_ in
                RoundedRectangle(cornerRadius: 10)
                    .frame(width: 200, height: 150, alignment: .center)
            }
        }
        .offset(x:offset)
        .gesture(
            DragGesture()
                .onChanged({ val in
                    self.offset = lastOffset + val.translation.width
                })
                .onEnded({ val in
                  lastOffset = offset
                })
        )
        .animation(.easeInOut)
    }
}


推荐阅读