swiftUI之手势

1.点击onTapGesture,count表示连续点击2次才触发

Text(user.name).onTapGesture(count: 2) {

                    print("点击")

                }

2.长按onLongPressGesture

Text(user.name).onLongPressGesture {

                    print("长按")

                }

/*minimumDuration表示最少按住2秒才会触发

*/

Text(user.name).onLongPressGesture(minimumDuration: 2) {

                    print("长按")

                }
Text(user.name).onLongPressGesture(minimumDuration: 2) { inProgress in
                    print("In progress: \(inProgress)!")//inProgress先是true再变成false
                } perform: {
                    print("Long pressed!")
                }

 3.

高级的手势,将gesture()修饰符与DragGesture拖拽长按LongPressGesture放大MagnificationGesture旋转RotationGesture点击TapGesture其中一个手势一起使用。它们都有特殊的修饰符,通常是onEnded()onChanged(),当手势正在运行(onChanged())或完成(onEnded())时,可以使用它们来执行操作。

点击:

Text(user.name).gesture(
                    TapGesture()
                     .onEnded({ index in
                        print("tap")
                    })
                
                )

拖拽:

Text(user.name).gesture(
                    DragGesture().onEnded({ index in
                        print("\(index)拖拽")
                    })
                )

4.SwiftUI总是优先考虑孩子的手势,这意味着当你点击上面的文本视图时,触发的是子视图,可以通过使用highPriorityStrengse()修饰符来强制触发父对象的手势。

 Text(user.name).onTapGesture {
                    print("tap")
                }.highPriorityGesture(
                    TapGesture()
                        .onEnded { _ in
                            print("VStack tapped")
                        }
                )

5.使用simultaneousGesture ()修饰符告诉SwiftUI您希望父手势和子手势同时触发.

Text(user.name).onTapGesture {
                    print("tap")
                }.simultaneousGesture(
                    TapGesture()
                        .onEnded { _ in
                            print("VStack tapped")
                        }
                )

6.手势序列,SwiftUI允许我们创建手势序列,其中一个手势只有在另一个手势首次成功时才会激活。这需要更多的思考,因为手势需要能够相互引用,所以不能直接将它们附加到视图上。

 // 拖动的距离
        @State private var offset = CGSize.zero

        // 当前是否在拖动
        @State private var isDragging = false

    var body: some View{
    
        // 一个在移动时更新偏移量和偏移量的 拖动手势
               let dragGesture = DragGesture()
                   .onChanged { value in self.offset = value.translation }
                   .onEnded { _ in
                       withAnimation {
                           self.offset = .zero
                           self.isDragging = false
                       }
                   }

               // 一个设置isDragging 的 长按手势
               let pressGesture = LongPressGesture()
                   .onEnded { value in
                       withAnimation {
                           self.isDragging = true
                       }
                   }

               // 强制用户长按然后拖动的组合手势
               let combined = pressGesture.sequenced(before: dragGesture)

               // 一个64x64的圆,当它被拖动时会放大,将它的偏移量设置为我们从拖动手势返回的值,并使用我们的组合手势
               return Circle()
                   .fill(Color.red)
                   .frame(width: 64, height: 64)
                   .scaleEffect(isDragging ? 1.5 : 1)
                   .offset(offset)
                   .gesture(combined)
        
    }

禁用手势:

.allowsHitTesting(false)

手势控制:点击矩形触发圆形

ZStack {
            Rectangle()
                .fill(Color.blue)
                .frame(width: 300, height: 300)
                .onTapGesture {
                    print("Rectangle tapped!")
                }
            Circle()
                .fill(Color.red)
                .frame(width: 300, height: 300)
                .contentShape(Rectangle())// 使用了这行代码后,点击Rectangle,也是触发ircle
                .onTapGesture {
                    print("Circle tapped!")
                }
        }
VStack {
    Text("Hello")
    Spacer().frame(height: 100)
    Text("World")
}
.contentShape(Rectangle())//有的这句代码,点击Spacer也能触发
.onTapGesture {
    print("VStack tapped!")
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值