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

相关推荐
unclecss14 分钟前
从 0 到 1 手写 Linux 调试器:ptrace 系统调用与断点原理
linux·运维·服务器·c语言·ptrace
last demo23 分钟前
fail2ban实验
linux·运维·服务器·网络
源梦想44 分钟前
火柴人龙拳网页格斗小游戏Linux部署演示
linux·运维·服务器
BD_Marathon1 小时前
【Zookeeper】搭建Zookeeper服务器
linux·服务器·zookeeper
星尘库1 小时前
怎么实现js混淆加密 每隔一段时间 会失效 需要重新加密使用
java·服务器·前端
a***56062 小时前
Knife4j文档请求异常(基于SpringBoot3,查找原因并解决)
java·服务器·数据库
未来之窗软件服务2 小时前
服务器运维(十六)vlang语言linuxSSH日志分析——东方仙盟炼气期
运维·服务器·服务器运维·东方仙盟
不染尘.2 小时前
计算机网络评价指标和封包解包
服务器·网络·计算机网络
p***92483 小时前
Nginx location 和 proxy_pass 配置详解
服务器·网络·nginx
源梦想3 小时前
绝地幸存者H5割草网页小游戏Linux部署演示
linux·运维·服务器