SwiftUI中使用DragGesture()计算不正确的高度

时间:2019-12-22 14:46:43

标签: ios swiftui drag

我正在使用SwiftUI做一个基于Map的应用程序,我需要像在Apple Maps中一样,通过上下拖动来更改模式卡片的高度(这是地图信息所在的视图)。

这是Card的屏幕截图,Im试图与之互动 https://i.stack.imgur.com/mZX2m.png

我已经用color实现了food,并添加了ZStack修饰符。

RoundedRectangle

第一个问题是向上拖动,卡超过屏幕高度,并且Im检查UIScreen边界高度以防止高度大于屏幕,但是计算存在更多问题,卡的高度非常快速地变得模棱两可,并且没有不想拖下去。

我从未与手势识别器一起工作过。你能告诉我正确的计算方法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

这是一种方法(下面的代码中有一些有用的注释)

SwiftUI view height resize

struct TestResizingCard: View {

    static let kMinHeight: CGFloat = 100.0
    @State var currentHeight: CGFloat = kMinHeight // << any initial

    var body: some View {
        GeometryReader { g in // << for top container height limit
            ZStack(alignment: .bottom) {
                Rectangle().fill(Color.yellow) // << just for demo

                self.card()
                .gesture(DragGesture()
                    .onChanged { value in
                        // as card is at bottom the offset is reversed
                        let newHeight = self.currentHeight - (value.location.y - value.startLocation.y)
                        if newHeight > Self.kMinHeight && newHeight < g.size.height {
                            self.currentHeight = newHeight
                        }
            })
            }
        }
    }

    func card() -> some View {
        ZStack(alignment: .top){
            RoundedRectangle(cornerRadius: 16.0)
                .frame(height:currentHeight)
            Text("Card")
                .font(.title)
                .fontWeight(.bold)
                .foregroundColor(Color.white)
                .multilineTextAlignment(.center)
                .padding(.top)
        }
    }
}

struct TestResizingCard_Previews: PreviewProvider {
    static var previews: some View {
        TestResizingCard()
    }
}