这篇文章主要了解在SwiftUI中如何使用手势,以及对@GestureState的学习,最后通过组合手势完成写一个拖拽卡片的小Demo。
Gesture modifier
SwiftUI提供了一系列的手势支持,比如 TapGesture, DragGesture, RotationGesture, MagnificationGesture, LongPressGesture等。我们可以通过对View添加modifier来增加手势支持,比如下面这块代码:
示例中,我们声明一个@GestureState修饰的布尔变量,来存储当前的长按状态,当被按下的时候更新view的背景色及大小。通过对Gesture增加update调用来更新isLongPressed,进而更新对应的View。此外我们在更新isLongPressed的闭包中增加了对value的打印,每次按下的时候都会将isLongPressed更新为true,在手势结束的时候自动将绑定的属性恢复为初始值。我们可以看下update的方法声明:
DragGesture
在前一小结的基础上,我们将通过DragGesture来实现对色块的拖动,在拖动结束后,检查拖动后的位置,如果超出了屏幕范围,则恢复到初始位置,否则停留在拖动结束的位置。通过前一小结学习到,在手势结束时SwiftUI会自动将@GestureState修饰的属性值恢复为初始值,在这里为了避免拖动结束时自动恢复到初始位置,我们使用@State来修饰View的拖动位置属性。代码实现如下:
Composing gestures
SwiftUI提供了三种组合手势的方式来支持对View添加多个手势的场景。分别为Simultaneous、Sequenced、Exclusive;当使用Simultaneous时SwiftUI会同时执行所有的手势、当使用Sequenced时会按照顺序线性的执行、当使用Exclusive时就只会执行子手势。以下示例使用Simultaneous组合了LongPressGesture和DragGesture。