Swift中.gesture的用法

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

基本用法

.gesture 修饰符的语法如下:

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

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

常用手势类型

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

1. 点击手势(TapGesture

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

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

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

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

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

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

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

swift 复制代码
LongPressGesture()
    .onChanged { isPressing in
        if isPressing {
            print("正在长按...")
        }
    }
    .onEnded { _ in
        print("长按完成!")
    }
3. 拖动手势(DragGesture

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

swift 复制代码
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

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

swift 复制代码
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

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

swift 复制代码
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:顺序手势(先识别第一个,再识别第二个)。
示例:同时支持缩放和旋转
swift 复制代码
struct ZoomAndRotateView: View {
    @State private var scale: CGFloat = 1.0
    @State private var angle: Angle = .zero
    
    var 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 修饰符:

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

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

总结

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

相关推荐
济南java开发,求内推4 小时前
单个服务器部署多个rabbitmq
运维·服务器·rabbitmq
wanhengidc4 小时前
云手机的多元功能应用
运维·服务器·网络·游戏·智能手机
热爱生活的五柒4 小时前
vscode如何链接远程服务器里面的docker里面的目录
服务器·vscode·docker
十五年专注C++开发5 小时前
CFF Explorer: 一款Windows PE 文件分析的好工具
c++·windows·microsoft
Bruce_Liuxiaowei5 小时前
Windows系统错误6118全面解决方案:修复此工作组的服务器列表当前无法使用
运维·服务器·windows·网络安全
望获linux6 小时前
【实时Linux实战系列】Linux 内核的实时组调度(Real-Time Group Scheduling)
java·linux·服务器·前端·数据库·人工智能·深度学习
云宏信息6 小时前
【深度解析】VMware替代的关键一环:云宏ROW快照如何实现高频业务下的“无感”数据保护?
服务器·网络·数据库·架构·云计算·快照
江公望6 小时前
ubuntu kylin(优麒麟)和标准ubuntu的区别浅谈
linux·服务器·ubuntu·kylin
生态笔记7 小时前
PPT宏代码
linux·服务器·powerpoint