当前位置: 首页 > news >正文

Swift中.gesture的用法

在 Swift 中,.gestureSwiftUI 框架中用于给视图添加交互手势的核心修饰符。它允许你将各种手势(如点击、长按、拖动、缩放等)绑定到视图上,当用户与视图进行对应交互时,会触发预设的动作。

基本用法

.gesture 修饰符的语法如下:

View.gesture(手势实例.onChanged { 手势变化时的回调 }.onEnded { 手势结束时的回调 }
)

通过这个修饰符,你可以为任意 SwiftUI 视图(如 TextImageRectangle 等)添加手势,实现交互逻辑。

常用手势类型

SwiftUI 内置了多种常用手势,以下是最常见的几种:

1. 点击手势(TapGesture

用于检测用户的点击操作,支持设置点击次数(如单击、双击)。

Text("点击我").padding().background(Color.blue).foregroundColor(.white).cornerRadius(8).gesture(TapGesture(count: 1) // 单击(默认值,可省略).onEnded {print("被点击了!")})

如果需要双击,只需将 count 设为 2:

TapGesture(count: 2).onEnded { print("双击了!") }
2. 长按手势(LongPressGesture

用于检测用户的长按操作,支持设置最小长按时间和是否需要保持按压。

Text("长按我").padding().background(Color.red).foregroundColor(.white).cornerRadius(8).gesture(LongPressGesture(minimumDuration: 1.0) // 至少长按 1 秒.onEnded { _ inprint("长按结束!")})

也可以通过 onChanged 监听长按过程(如“正在长按”的状态):

LongPressGesture().onChanged { isPressing inif isPressing {print("正在长按...")}}.onEnded { _ inprint("长按完成!")}
3. 拖动手势(DragGesture

用于检测用户拖动视图的操作,可获取拖动的位移、位置等信息,常用于实现视图的拖拽移动。

struct DragView: View {@State private var offset = CGSize.zero // 记录偏移量var body: some View {Circle().frame(width: 100, height: 100).foregroundColor(.green).offset(offset) // 应用偏移.gesture(DragGesture().onChanged { value in// 实时更新偏移量(value.translation 是当前拖动的相对位移)offset = value.translation}.onEnded { _ in// 结束时复位(可选)offset = .zero})}
}

DragGesturevalue 包含丰富信息:

  • translation:当前拖动的相对位移(相对于起点);
  • location:当前手指在父坐标系中的位置;
  • startLocation:拖动开始时的位置。
4. 缩放手势(MagnificationGesture

用于检测双指缩放操作,可获取缩放比例,常用于实现视图的放大/缩小。

struct ZoomView: View {@State private var scale: CGFloat = 1.0 // 缩放比例(默认 1.0)var body: some View {Image(systemName: "star").font(.system(size: 100)).scaleEffect(scale) // 应用缩放.gesture(MagnificationGesture().onChanged { value in// value 是当前缩放比例(相对于初始状态,1.0 为原始大小)scale = value})}
}
5. 旋转手势(RotationGesture

用于检测双指旋转操作,可获取旋转角度,常用于实现视图的旋转。

struct RotateView: View {@State private var angle: Angle = .zero // 旋转角度(默认 0)var body: some View {Rectangle().frame(width: 200, height: 100).foregroundColor(.purple).rotationEffect(angle) // 应用旋转.gesture(RotationGesture().onChanged { value in// value 是当前旋转角度(单位:弧度)angle = value})}
}

手势组合

SwiftUI 支持将多个手势组合,实现更复杂的交互(如同时支持缩放和旋转)。常用的组合方式有:

  • SimultaneousGesture:同时识别多个手势;
  • ExclusiveGesture:互斥手势(只识别优先级高的);
  • SequenceGesture:顺序手势(先识别第一个,再识别第二个)。
示例:同时支持缩放和旋转
struct ZoomAndRotateView: View {@State private var scale: CGFloat = 1.0@State private var angle: Angle = .zerovar body: some View {Image(systemName: "heart.fill").font(.system(size: 100)).foregroundColor(.red).scaleEffect(scale).rotationEffect(angle).gesture(// 同时识别缩放和旋转手势SimultaneousGesture(MagnificationGesture().onChanged { scale = $0 },RotationGesture().onChanged { angle = $0 }))}
}

手势优先级

默认情况下,子视图的手势会优先于父视图的手势。如果需要强制父视图的手势优先,可以使用 .highPriorityGesture 修饰符:

VStack {Text("子视图").gesture(TapGesture().onEnded { print("子视图被点击") })
}
.highPriorityGesture( // 父视图手势优先级更高TapGesture().onEnded { print("父视图被点击") }
)

此时点击子视图,会优先触发父视图的手势。

总结

.gesture 是 SwiftUI 中处理用户交互的核心工具,通过它可以轻松为视图添加点击、长按、拖动、缩放、旋转等手势,并支持组合手势和优先级控制,大幅简化了交互逻辑的实现。

http://www.dtcms.com/a/497004.html

相关文章:

  • 厦门企业自助建站系统建站软件可以不通过网络建设吗
  • 电商建网站运营襄阳网站建设公司哪家好
  • 网站建设的培训心得万维网网站注册
  • 网站左侧边栏导航代码企业计划书
  • 歙县建设银行网站成都行业网站
  • 整体设计 逻辑系统程序 之33 程序定稿 PIN 语言工具设计需求与交付方案
  • 江门网站推广技巧wordpress获取tag名称
  • 湘潭哪里做网站 电话阿里巴巴的电子商务网站建设
  • Qwen3VL源码侧改进点及DeepStack核心思想概述
  • 设计一个商务网站专做ppt的网站
  • OLTP与OLAP:数据处理世界的双生花
  • 廊坊网站建设兼职糖果果屋网站建设规划书
  • 三乡网站开发莱芜半岛
  • 查网站是什么公司做的全国装饰公司最新排行榜
  • 【大模型备案】全国有439个大模型通过生成式人工智能大模型备案!
  • 介绍 一下 [特殊字符] 代数
  • 公司付的网站费怎么做分录php的网站有哪些
  • Ollama 新动作,联网搜索、MCP、云端大模型,更强了
  • 怎样做服装网站用dw做音乐网站模板
  • 电影新网站如何做seo优化wordpress不显示引用图片不显示
  • 学校网站建设流程360建筑网电脑版
  • Xshell8
  • 太原网站关键词优化注册公司条件和要求
  • 自己做网站怎么连接外网中国网警中心官网
  • 网站建设推广平台有哪些开发商延期交房怎么处理
  • 网站备案 不关站wordpress网站视频播放
  • 有哪些设计网站app智能小程序收款码
  • win7系统做网站服务器网页制作软件电脑
  • 重庆茂尔建设集团有限公司网站外贸流程知乎
  • 北流网站建设制作二手网站建设论文答辩