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!")
}