本文主要是介绍SwiftUI中的手势(MagnificationGesture、 RotationGesture),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
通过前两篇文章的探索,手势的基本使用规则已经较深的了解,本篇文章主要看看放缩手势MagnificationGesture
和旋转手势RotationGesture
。
MagnificationGesture 放缩手势
放缩手势在App中用的也比较广泛,下面先看一个示例效果:
上面示例中将图片进行了放大,主要使用了MagnificationGesture
手势,并对该手势添加了.updating
和.onEnded
修饰符。
在添加.updating
修饰符的时候绑定了一个@GestureState
修饰的scalingRatio
变量,用来记录每次放大的比例值,每次放缩结束该值重置。
同时为了每次的放缩都基于上次的大小继续放缩,需要用一个@State
修饰的变量记录每次放缩结束的比例值,并在.onEnded
修饰符中进行赋值。
.gesture(MagnificationGesture().updating($scalingRatio, body: { value, state, _ instate = value}).onEnded({ value inlastRatio *= 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.0var 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, _ instate = value}).onEnded({ value inlastRatio *= value}))}}
}
RotationGesture 旋转手势
旋转手势和放缩手势用法基本上是一致的,先看一下示例效果:
上面示例中将图片进行了旋转,主要使用了RotationGesture
手势,并对该手势添加了.updating
和.onEnded
修饰符。
在添加.updating
修饰符的时候绑定了一个@GestureState
修饰的rotateAngle
变量,用来记录每次旋转的角度,每次旋转结束该值重置。
同时为了每次的旋转都基于上次的角度继续旋转,需要用一个@State
修饰的变量记录每次旋转的角度,并在.onEnded
修饰符中进行赋值。
.gesture(RotationGesture().updating($rotateAngle, body: { value, state, _ instate = value}).onEnded({ value inlet newDegress = lastAngle.degrees + value.degreeslastAngle = 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, _ instate = value}).onEnded({ value inlet newDegress = lastAngle.degrees + value.degreeslastAngle = Angle(degrees: newDegress)}))}}
}
最后,希望能够帮助到有需要的朋友,如果觉得有帮助,还望点个赞,添加个关注,笔者也会不断地努力,写出更多更好用的文章。
这篇关于SwiftUI中的手势(MagnificationGesture、 RotationGesture)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!