基本概念
在ios中我们经常用到的手势操作有点击,长按,拖拽,缩放,旋转。在手势操作时,不同的手势有不同的触发函数,比如,点击在点击完成时触发某个函数,拖拽手势不仅仅在拖拽完成时触发函数,而在拖拽的过程中也可以触发两个函数,在这两个函数中捕捉到不同的参数。对于手势的捕获也有两种方式,我们具体的看下这两种方式
方式一,通过gesture捕获手势
我们可以给View添加一个gesture()
的装饰函数来捕捉手势,在这个函数中设定不同Gesture()
就可以捕捉到不同的手势。在捕捉到手势之后,还有3个回调函数处理不同的情况,updating(_:body)
在手势操作时被调用,这个函数需要绑定一个@GestureState
修饰的变量,这个变量在回调时被修改,但只是临时的修改,手势操作完这个变量会被修改为手势操作之前的初始化值.onChange(_:)
这个同样是在手势操作时被调用,这个函数中修改的变量在手势操作结束时被保留。onEnd()
这个函数时在手势操作成功之后调用。
缩放
我们设定一个图片缩放场景来演示缩放手势,先通过image显示一张图片,我们通过缩放手势让图片放大或者缩小。捕获的gesture是MagnificationGesture
.代码如下
@GestureState var zoom:CGFloat=1
Image("j1").resizable().frame(width: 200, height: 200, alignment: .leading).scaleEffect(zoom).gesture(MagnificationGesture().updating($zoom, body: {
gestureZoom,z,transaction in
z=gestureZoom
}))
设定一个@GestureState
修饰的变量zoom
,用来控制图片的缩放比例。在这段代码中gestureZoom
是我们做缩放手势时的缩放比例,z
就是zoom
,我们将gestureZoom
的数值赋值过去,图片就放大/缩小,当我们手势结束时,zoom
就变成1。图片回到原先大小。
@State var zoom:CGFloat=1
Image("j1").resizable().frame(width: 200, height: 200, alignment: .leading).scaleEffect(zoom).gesture(MagnificationGesture().onChanged({
z in zoom=z
}))
这段代码,我们将zoom
用@State
修饰,onChange
中z
是缩放比例,我们将z
赋值给zoom
。图片同样放大/缩小.但是手势结束时,图片不会还原。
@State var zoom:CGFloat=1
Image("j1").resizable().frame(width: 200, height: 200, alignment: .leading).scaleEffect(zoom).gesture(MagnificationGesture().onEnded({
z in zoom=z}))
这段代码,我们在onEnd
中设置zoom
的数值,图片只有在手势完成之后才显示出来缩放。
以上的三段代码展示了三个回调函数的作用。那么我们要完成一个图片的缩放功能是如何实现的呢。代码如下
@State var zoom