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

相关文章

XMG 各种手势

1. - (void)setUpTap {     // 创建点按手势     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];     tap.numberOfTapsRequired=2;     tap.deleg

XMG 常用的手势

// 创建点按手势     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];    tap.numberOfTabsRequired=2; //点击的次数

iOS Runloop面试题(解释一下 手势识别 的过程?)

解释一下 手势识别 的过程? 当上面的 _UIApplicationHandleEventQueue()识别了一个手势时,其首先会调用 Cancel 将当前的 touchesBegin/Move/End 系列回调打断。随后系统将对应的 UIGestureRecognizer 标记为待处理。 苹果注册了一个 Observer 监测 BeforeWaiting (Loop即将进入休眠) 事件,这个

编写 Android 触摸屏手势识别程序

很多时候,利用触摸屏的Fling、Scroll等Gesture(手势)操作来操作会使得应用程序的用户体验大大提升,比如用Scroll手势在 浏览器中滚屏,用Fling在阅读器中翻页等。在Android系统中,手势的识别是通过 GestureDetector.OnGestureListener接口来实现的,不过William翻遍了Android的官方文档也没有找到一个相 关的例子,API Demo

IOS 手势与Button事件互不影响

1、首先在.h 头文件中添加<UIGestureRecognizerDelegate>委托 2、在.m 体文件中添加实现该委托的方法 #pragma mark - UIGestureRecognizerDelegate // 当一个事件判定为是一个手势时,先进入手势代理方法。该方法中判断点击的视图是不是button如果是button则返回NO,手势不响应该事件,既然没响应,也不会取

基于深度学习网络的USB摄像头实时视频采集与手势检测识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 系统架构 4.2 GoogLeNet网络简介 4.3 手势检测 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 训练过程如下: 将摄像头对准手势,然后进行识别,识别结果如下: 本课题中,使用的USB摄像头为: 2.算法运行软

搜维尔科技:基于人体工学和多形态手势识别的交互式人机交互系统研究与设计

搜维尔科技:基于人体工学和多形态手势识别的交互式人机交互系统研究与设计 搜维尔科技:基于人体工学和多形态手势识别的交互式人机交互系统研究与设计

SwiftUI 6.0(Xcode 16)全新 @Entry 和 @Previewable 宏让开发妙趣横生

概览 如火如荼的 WWDC 2024 已进入第五天,苹果开发平台中众多海量新功能都争先恐后的喷薄欲出。 在这里就让我们从中挑两个轻松有趣的新功能展示给小伙伴们吧:它们分别是 全新的 @Entry 和 @Previewable 宏。 在本篇博文中,您将学到如下内容: 概览1. 用 @Entry 宏简化环境变量定义2. @Previewable 让 Xcode 预览调试安闲自得

SwiftUI 6.0(iOS 18)新容器视图修改器漫谈

概览 本届 WWDC 2024 观影正如火如荼的进行中,一片鸟语花香、枝繁叶茂的苹果树上不时结出几颗令人垂涎欲滴的美味苹果让秃头码农们欲罢不能。 如您所愿,在界面布局“利器” SwiftUI 这根蔓藤也长出不少喜人的果实,其中在 iOS 18.0 中新添加的容器视图修改器大家一定不能错过。 在本篇博文中,您将学到如下内容: 概览1. 探囊取物:获取容器子视图2. 聚沙成塔:重新

IOSnbsp;手势识别教程:二指拨动…

http://blog.csdn.net/toss156/article/details/7354240#t1