SwiftUI中的手势(TapGesture、LongPressGesture、GestureState的使用)

本文主要是介绍SwiftUI中的手势(TapGesture、LongPressGesture、GestureState的使用),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

手势操作在App中可谓是用途非常广泛了,常规的手势修饰符有TapGesture点击手势、LongPressGesture长按手势、DragGesture拖拽手势,MagnificationGesture放缩手势和 RoationGesture旋转手势。
和常规的修饰符方法类似,只要将手势修饰符添加到视图中,系统就会自动识别用户的操作,并根据对应的手势交互执行相对应的指令。

本篇文章主要探索一下TapGesture点击手势、LongPressGesture长按手势。

TapGesture 点击手势

TapGesture点击手势是使用频率最高的手势之一,用于触发点击动作。有时候点击手势修饰符代替了常规的Button按钮.

struct TapGestureDemo: View {@State private var backgroundColor: Color = .blackvar body: some View {RoundedRectangle(cornerRadius: 25).fill(backgroundColor).frame(width: 300, height: 200).onTapGesture {backgroundColor = .red}}
}

添加点击手势直接在要点击的视图上加上.onTapGesture修饰符即可,上面代码点击矩形后改变其自身的背景色。
默认是点击一下就生效,当然也可以设置连续点击几次才生效,比如:

.onTapGesture(count: 2, perform: {backgroundColor = .red
})

.onTapGesture修饰符中传入count参数即可,上面代码中,需要连续点击两下才生效。

SwiftUI还提供了.gesture手势修饰符来进行手势识别,如下:

struct TapGestureDemo: View {@State private var backgroundColor: Color = .blackvar body: some View {RoundedRectangle(cornerRadius: 25).fill(backgroundColor).frame(width: 300, height: 200).gesture(TapGesture().onEnded({backgroundColor = .red}))}
}

TapGesture()添加到.gesture修饰符的闭包中,点击结束后执行.onEnded闭包中的逻辑。这个.onEnded修饰符是用来修TapGesture势的。

LongPressGesture 长按手势

LongPressGestureTapGesture手势多了一个长按的操作,也就是点击后不是立即抬起,需要按住一段时间才会响应的手势。

长按手势的修饰符为:.onLongPressGesture
代码如下:

struct LongPressGesture: View {@State private var backgroundColor: Color = .blackvar body: some View {RoundedRectangle(cornerRadius: 25).fill(backgroundColor).frame(width: 300, height: 200).onLongPressGesture {backgroundColor = .red}}
}

还是上面的代码,长按后改变矩形的背景色。

.onLongPressGestue修饰符有几个参数:
minimumDuration:最短按住多久就响应事件。默认的长按时间是0.5秒。

.onLongPressGesture(minimumDuration: 2) {......
}

maximumDistance: 最长移动距离,按住后手指移动超过这个距离,且未到响应时间,则终止长按手势的响应事件。也就是相当于撤销了这次长按,比如用户误操作了,立即将手移走。默认值为10.

.onLongPressGesture(maximumDistance: 30) {......
}

LongPressGestue长按手势同样可以放到.gesture修饰符的闭包中使用,并且给LongPressGestue添加.onEnded修饰符实现长按事件,同时还可以添加.onChanged修饰符,具体如下:

.gesture(LongPressGesture(minimumDuration: 2).onChanged({ state inprint("---> onChanged state: \(state)")}).onEnded({ state inprint("---> onEnded state: \(state)")})
)

.onChanged修饰符在刚按住的时候触发,闭包内返回一个bool类型的参数,经测试返回true
.onEnded修饰符在达到minimumDuration时间时触发,闭包内返回一个bool类型的参数,经测试返回true

除了这两个外,还可以添加一个.updating修饰符。

struct LongPressGestureDemo: View {@GestureState private var isLongPressing = falsevar body: some View {Circle().fill(Color.blue).frame(width: 100, height: 100).gesture(LongPressGesture().updating($isLongPressing, body: { value, state, _ instate = value})).scaleEffect(isLongPressing ? 1.5 : 1.0)}
}

.updating修饰符是一个更新方法,它需要绑定一个被@GestureState修饰的变量,在长按的过程中,这个变量将会被赋值。

@GestureState修饰的变量记录了手势状态的变化,并且在每次手势动画结束后,变量的值将会重置到初始状态。

.updatingbody闭包中有3个参数:

  • 第一个参数:长按手势更新后的状态,即最新的状态值。
  • 第二个参数:长按手势前一个状态,即上一次的状态值。
  • 第三个参数:长按手势的上下文,基本用不到。

上面代码中我们将第一个参数赋值给第二个参数,也就是用最新的状态更新之前的状态,继而改变了绑定的变量的值。也就是说@GestureState修饰的变量记录了第二个参数的值。

.updating修饰符在LongPressGesture上用处基本上是体现不出来,在DragGesture中体现的还是比较明显的。

写在最后

本篇文章主要介绍了TapGestureLongPressGestue,以及@GestureState属性包装器的概念的等等,文章内容比较简单。

最后,希望能够帮助到有需要的朋友,如果觉得有帮助,还望点个赞,添加个关注,笔者也会不断地努力,写出更多更好用的文章。

这篇关于SwiftUI中的手势(TapGesture、LongPressGesture、GestureState的使用)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrl+shift+N,进入无痕模式3. 不需要登录(也就是访客模式)4. 两次用完,关闭无痕模式(继续重复步骤 2 - 4) 1. 打开谷歌浏览器 2. 按住ctrl+shift+N,进入无痕模式 输入网址:https://www.connectedpapers.com/ 3. 不需要登录(也就是

Toolbar+DrawerLayout使用详情结合网络各大神

最近也想搞下toolbar+drawerlayout的使用。结合网络上各大神的杰作,我把大部分的内容效果都完成了遍。现在记录下各个功能效果的实现以及一些细节注意点。 这图弹出两个菜单内容都是仿QQ界面的选项。左边一个是drawerlayout的弹窗。右边是toolbar的popup弹窗。 开始实现步骤详情: 1.创建toolbar布局跟drawerlayout布局 <?xml vers

C#中,decimal类型使用

在Microsoft SQL Server中numeric类型,在C#中使用的时候,需要用decimal类型与其对应,不能使用int等类型。 SQL:numeric C#:decimal

探索Elastic Search:强大的开源搜索引擎,详解及使用

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选,相信大家多多少少的都听说过它。它可以快速地储存、搜索和分析海量数据。就连维基百科、Stack Overflow、

flask 中使用 装饰器

因为要完成毕业设计,我用到fountain code做数据恢复。 于是在github上下载了fountain code的python原代码。 github上的作者用flask做了fountain code的demo。 flask是面向python的一个网站框架。 里面有用到装饰器。 今天笔试的时候,我也被问到了python的装饰器。

mathematica的使用

因为做实验用到Bloom filter这一技术,Bloom filter里面的数学公式可以用来画图。 那么用什么画图软件比较好呢? 当然是Mathematica啦。 利用代码Plot[{y=x},{x,0,100}] 就可以画出比较好的图 简直nice