SwiftUI中的手势(MagnificationGesture、 RotationGesture)

2024-05-25 10:44

本文主要是介绍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)

另外在视图的顶部对scalingRatiolastRatio两个变量进行了显示,可以直观的观察整个放缩过程中,这两个变量的变化。

在松手的时候,想要将图片变回原来的尺寸,只需要将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))

另外在视图的顶部对rotateAnglelastAngle两个变量进行了显示,可以直观的观察整个旋转过程中,这两个变量的变化。

在松手的时候,想要将图片变回原来的角度,只需要将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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1001276

相关文章

【HarmonyOS】头像圆形裁剪功能之手势放大缩小,平移,双击缩放控制(三)

【HarmonyOS】头像裁剪之手势放大缩小,平移,双击缩放控制(三) 一、DEMO效果图: 二、开发思路: 使用矩阵变换控制图片的放大缩小和平移形态。 通过监听点击手势TapGesture,缩放手势PinchGesture,拖动手势PanGesture进行手势操作的功能实现。 通过对矩阵变换参数mMatrix的赋值,将矩阵变换参数赋值给image控件。实现手势操作和图片操作的同步。

Android多点触摸手势滑动的一种简单方法

GestureDetector_left = new GestureDetector(this,new GestureListener_left());       //左部  手势监听(内部类) GestureDetector_right = new GestureDetector(this,new GestureListener_right());   //右部  手势监听(内部类)

【iOS】状态栏颜色和pop手势

说明 UINavigationController 管理状态栏颜色,需要转发给单个控制器 class NavController: UINavigationController {override func viewDidLoad() {super.viewDidLoad()}override var preferredStatusBarStyle: UIStatusBarStyle {let

鸿蒙开发入门day16-拖拽事件和手势事件

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,还请三连支持一波哇ヾ(@^∇^@)ノ) 目录 拖拽事件 概述 拖拽流程 ​手势拖拽 ​鼠标拖拽 拖拽背板图 开发步骤 通用拖拽适配 多选拖拽适配 手势事件 gesture(常规手势绑定方法) priorityGesture(带优先级的手势绑定方法) parallelGesture(并行手势绑定

手势密码(四)

之前写过3篇手势密码的demo,不过没有集成到真实的企业项目中,这几天正好领到一个手势密码项目,昨天刚好弄完,今天抽空整理下,目前还没有完善,有一些地方需要更改,不过基本的流程都可以跑通了 源码下载地址。。。。。 先看主界面的入口把、里面有2个button(一个是设置手势密码、一个是校验手势密码) activity_main.xml <RelativeLayout

手势密码(三)

源码地址下载 先看第一张图片的布局文件 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_paren

手势密码(二)

代码地址下载 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_

基于SVM的手势识别,SVM工具箱详解,SVM工具箱使用注意事项

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 SVM应用实例,基于支持向量机SVM的手势识别 代码 结果分析 展望 摘要 基于支持向量机SVM的手势识别,SVM原理,SVM工具箱详解,SVM常见改进方法 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)

如何处理多点触控、滑动手势,以及如何通过 `MotionEvent` 获取触摸的详细信息(如坐标、压力、手指的数量等)

处理多点触控(multi-touch)、滑动手势(scroll gestures)以及通过 MotionEvent 获取触摸的详细信息是自定义视图开发中的重要技能。以下是详细的讨论和示例代码,展示如何处理这些触控事件。 1. 处理多点触控 在 Android 中,MotionEvent 类提供了触摸事件的详细信息,包括多点触控的数据。通过 MotionEvent,你可以处理每个触摸点的信息,如

使用Leap Motion Orion开发酷炫的手势识别VR/AR应用

Leap Motion Orien支持Oculus和HTC Vive开发,当然对Unity的支持显然是必须的。 不过前提是: 1.Windows 7 64位或者windows 10 2.Leap Motion Orion 3.Oculus SDK 1.3(需要Unity 5.3.4 p1以上版本) 4.HTC Vive(需要Unity 5.4+) U