通过前两篇文章的探索,手势的基本使用规则已经较深的了解,本篇文章主要看看放缩手势MagnificationGesture
和旋转手势RotationGesture
。
MagnificationGesture 放缩手势
放缩手势在App中用的也比较广泛,下面先看一个示例效果:
上面示例中将图片进行了放大,主要使用了MagnificationGesture
手势,并对该手势添加了.updating
和.onEnded
修饰符。
在添加.updating
修饰符的时候绑定了一个@GestureState
修饰的scalingRatio
变量,用来记录每次放大的比例值,每次放缩结束该值重置。
同时为了每次的放缩都基于上次的大小继续放缩,需要用一个@State
修饰的变量记录每次放缩结束的比例值,并在.onEnded
修饰符中进行赋值。
.gesture(
MagnificationGesture()
.updating($scalingRatio, body: { value, state, _ in
state = value
})
.onEnded({ value in
lastRatio *= value
})
)
有了这两个值后,在Image
图片上添加.scaleEffect
修饰符,改变Image
的尺寸。
.scaleEffect(scalingRatio)
.scaleEffect(lastRatio)
如果用一个.scaleEffect
修饰符,记得将两个变量相乘。
.scaleEffect(scalingRatio * lastRatio)
另外在视图的顶部对scalingRatio
和lastRatio
两个变量进行了显示,可以直观的观察整个放缩过程中,这两个变量的变化。
在松手的时候,想要将图片变回原来的尺寸,只需要将lastRatio
以及相关代码移除即可。
完成代码如下:
struct MagnificationGestureDemo: View {
@GestureState private var scalingRatio: CGFloat = 1.0
@State private var lastRatio: CGFloat = 1.0
var body: some View {
ZStack {
VStack {
Text("scalingRatio: \(scalingRatio)")
Text("lastRatio: \(lastRatio)")
Spacer()
}
Image("liuyifei")
.resizable()
.frame(width: 200, height: 260)
.scaleEffect(scalingRatio)
.scaleEffect(lastRatio)
.gesture(
MagnificationGesture()
.updating($scalingRatio, body: { value, state, _ in
state = value
})
.onEnded({ value in
lastRatio *= value
})
)
}
}
}
RotationGesture 旋转手势
旋转手势和放缩手势用法基本上是一致的,先看一下示例效果:
上面示例中将图片进行了旋转,主要使用了RotationGesture
手势,并对该手势添加了.updating
和.onEnded
修饰符。
在添加.updating
修饰符的时候绑定了一个@GestureState
修饰的rotateAngle
变量,用来记录每次旋转的角度,每次旋转结束该值重置。
同时为了每次的旋转都基于上次的角度继续旋转,需要用一个@State
修饰的变量记录每次旋转的角度,并在.onEnded
修饰符中进行赋值。
.gesture(
RotationGesture()
.updating($rotateAngle, body: { value, state, _ in
state = value
})
.onEnded({ value in
let newDegress = lastAngle.degrees + value.degrees
lastAngle = Angle(degrees: newDegress)
})
)
有了这两个值后,在Image
图片上添加.rotationEffect
修饰符,改变Image
的尺寸。
.rotationEffect(rotateAngle)
.rotationEffect(lastAngle)
如果用一个.rotationEffect
修饰符,需要将两个变量的degrees
相加构建一个新的Angle
传入进去。
.rotationEffect(Angle(degrees: rotateAngle.degrees + lastAngle.degrees))
另外在视图的顶部对rotateAngle
和lastAngle
两个变量进行了显示,可以直观的观察整个旋转过程中,这两个变量的变化。
在松手的时候,想要将图片变回原来的角度,只需要将lastAngle
以及相关代码移除即可。
完成代码如下:
struct RotationGestureDemo: View {
@GestureState private var rotateAngle: Angle = Angle(degrees: 0.0)
@State private var lastAngle: Angle = Angle(degrees: 0.0)
var body: some View {
ZStack {
VStack {
Text("rotateAngle: \(rotateAngle.degrees)")
Text("lastAngle: \(lastAngle.degrees)")
Spacer()
}
Image("liuyifei")
.resizable()
.frame(width: 200, height: 260)
.rotationEffect(rotateAngle)
.rotationEffect(lastAngle)
.gesture(
RotationGesture()
.updating($rotateAngle, body: { value, state, _ in
state = value
})
.onEnded({ value in
let newDegress = lastAngle.degrees + value.degrees
lastAngle = Angle(degrees: newDegress)
})
)
}
}
}
最后,希望能够帮助到有需要的朋友,如果觉得有帮助,还望点个赞,添加个关注,笔者也会不断地努力,写出更多更好用的文章。