LongPressGuesture in SwiftUI
在SwiftUI中,我们偶尔也会使用到长按手势,他和点击手势很类似,但又不同。长按手势对于手指按下是有时间限制的默认是0.5s。我们一起来看看吧。
struct LongPressGestureSample: View {
@State var isComplete: Bool = false
var body: some View {
Text(isComplete ? "Completed" : "No complete")
.font(.title2)
.padding()
.padding(.horizontal, 10)
.background(isComplete ? Color.green : Color.gray)
.cornerRadius(10)
.onLongPressGesture {
isComplete.toggle()
}
}
}
当我们长按0.5s后,背景色和文字都会发生变化,这是简单的使用LongPressGuesture的形态。
onLongPressGuesture 支持多个参数,上面我们只是使用了最为简单的参数方法,下面我们来看看其他参数。
onLongPressGesture(
minimumDuration: 1.0,
maximumDistance: 50,
pressing: { flg in
print("flg (flg)")
}, perform: {
isComplete = true
})
pressing 这个参数很特别,当你在开始长按和解释长按时都会触发这个Boolean值,当你开始长按时flg值是true,结束或者松开长按手势时返回false
我们可以使用这个方法来完成一个进度条的功能,代码也非常少。功能如下:
- 当我们长按完成时,进度条背景色变成绿色, 否则是灰色
- 当我们开始长按时,进度条颜色时蓝色,如果进度条在规定时间内长按结束,那么进度条变成绿色
- 如果长按手势时间不足规定时间,那么就取消进度条的进度,把进度变成0
我们会用两个变量来控制,一个变量来控制是否已经完成了长按手势,一个变量来控制长按手势是否加入或者离开/完成。
@State var isComplete: Bool = false
@State var isSuccess: Bool = false
VStack(spacing: 30) {
Rectangle()
.fill(isSuccess ? Color.green : Color.blue)
.frame(maxWidth: isComplete ? .infinity : 0)
.frame(height: 60)
.frame(maxWidth: .infinity, alignment: .leading)
.background(Color.gray)
.cornerRadius(60/2)
HStack {
Text("Long Press Me")
.foregroundColor(.white)
.padding()
.background(Color.black)
.cornerRadius(10)
.onLongPressGesture(
minimumDuration: 1.0,
maximumDistance: 50,
pressing: { flg in
// 长按手势开始了
if flg {
withAnimation(.easeIn(duration: 1.0)) {
isComplete = true
}
} else {
// 长按手势取消或完成
DispatchQueue.main.asyncAfter(deadline: .now() 0.1, execute: {
if !isSuccess {
withAnimation(.easeInOut) {
isComplete = false
}
}
})
}
}, perform: {
// 长时手势设置的时间到了
isSuccess = true
})
Text("Rest")
.foregroundColor(.white)
.padding()
.background(Color.black)
.cornerRadius(10)
.onTapGesture {
isSuccess = false
isComplete = false
}
}
}
.padding()
主要逻辑在pressing方法里面。
当我们刚点击按钮时就会返回一次pressing值,此时为true,我们更新isComplete值,让它做动画,把宽度从0扩展到设定的.infinity的宽度。如果在长按期间有另一个值返回也就是false,
我们会在非常短的时间内做一个延迟检测变量的操作,如果isSuccess是true,那么就说明已经完成Perform方法,表明长按时间已经到了,证明动画已经完成了,我们就不做任何处理。 如果此时的isSuccess是false,那么证明手势未完成就离开了,那么进度条就要恢复到起始状态,也就是0宽度
一起来看看效果
大家有什么看法呢?欢迎留言讨论。
公众号:RobotPBQ
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgaifaf
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01