SwiftUI视图在初始拖动时跳转

SwiftUI视图在初始拖动时跳转,swiftui,Swiftui,我期待有一个过程中,卡开始在屏幕底部,可以上下拖动(垂直轴只)。我有一个问题,在第一次拖动时,卡会从屏幕底部跳到顶部。我已将下面的内容简化到最低限度,以说明这个问题。我原以为这是某种协调空间的问题,但在局部和全局之间改变并没有帮助 struct ContentView: View { @State private var offset = CGSize(width: 0, height: UIScreen.main.bounds.height * 0.9)

我期待有一个过程中,卡开始在屏幕底部,可以上下拖动(垂直轴只)。我有一个问题,在第一次拖动时,卡会从屏幕底部跳到顶部。我已将下面的内容简化到最低限度,以说明这个问题。我原以为这是某种协调空间的问题,但在局部和全局之间改变并没有帮助

    struct ContentView: View {
        @State private var offset = CGSize(width: 0, height: UIScreen.main.bounds.height * 0.9)
        
        var body: some View {
            GeometryReader { geo in
                Color(.red).edgesIgnoringSafeArea(.all)
                Color(.orange)
                    .clipShape(RoundedRectangle(cornerRadius: 20))
                    .offset(offset)
                    .animation(.spring())
                    .gesture(DragGesture()
                        .onChanged { gesture in
                            offset.height = gesture.translation.height
                        }
                    )
            }
        }
}

同样,当手指位于底部橙色视图顶部的第一个位置且拖动手势开始向上时,橙色视图会跳到红色视图的顶部。

您可以将两个不同的偏移分离到两个不同的修改器。首先将.offset()与起始金额相加。然后添加另一个.offset(),它将从起始偏移偏移视图

我还添加了一个.oneded手势,这样在开始第二次拖动时就不会延迟。您可能需要更改.oneded,以便在手势结束时视图朝锁定位置设置动画

struct DragView:视图{
@国家私有变量偏移量:CGFloat=0
@状态私有变量lastfosety:CGFloat=0
var body:一些观点{
GeometryReader{geo-in
颜色(.red)
.ignoresSafeArea()
颜色(.橙色)
.clipShape(圆角半径:20))
.偏移量(y:UIScreen.main.bounds.height*0.8)
.偏移量(y:偏移量)
.animation(.spring())
.手势(DragGesture()
.onChanged{手势在
使用动画(.spring()){
offsetY=lastOffsetY+手势.translation.height
}
}
.onEnded{uuin
lastOffsetY=offsetY
}
)
}
}
}

您可以将两个不同的偏移分离到两个不同的修改器。首先将.offset()与起始金额相加。然后添加另一个.offset(),它将从起始偏移偏移视图

我还添加了一个.oneded手势,这样在开始第二次拖动时就不会延迟。您可能需要更改.oneded,以便在手势结束时视图朝锁定位置设置动画

struct DragView:视图{
@国家私有变量偏移量:CGFloat=0
@状态私有变量lastfosety:CGFloat=0
var body:一些观点{
GeometryReader{geo-in
颜色(.red)
.ignoresSafeArea()
颜色(.橙色)
.clipShape(圆角半径:20))
.偏移量(y:UIScreen.main.bounds.height*0.8)
.偏移量(y:偏移量)
.animation(.spring())
.手势(DragGesture()
.onChanged{手势在
使用动画(.spring()){
offsetY=lastOffsetY+手势.translation.height
}
}
.onEnded{uuin
lastOffsetY=offsetY
}
)
}
}
}

将初始偏移量设为零或在拖动时考虑。@Asperi-如果我将初始偏移量设为零,橙色卡将几乎全屏显示,这是我不想要的。我需要卡片从底部开始,只显示顶部的一小部分(例如苹果地图)。那么,考虑阻力是什么意思?谢谢。实际上我想我明白你的意思了。例如,如果我在onChanged上这样做:
offset.height=(UIScreen.main.bounds.height*0.9)+signature.translation.height
将初始偏移量设为零或在拖动时考虑。@Asperi-如果我将初始偏移量设为零,橙色卡片将几乎全屏,这是我不想要的。我需要卡片从底部开始,只显示顶部的一小部分(例如苹果地图)。那么,考虑阻力是什么意思?谢谢。实际上我想我明白你的意思了。例如,如果我在onChanged上这样做了:
offset.height=(UIScreen.main.bounds.height*0.9)+手势.translation.height