jen*_*odi 9 ios swiftui swiftui-list
使用 SwiftUI(最新的 XCode 并在 IOS 13.3 上测试)我试图在列表中的项目上实现长按手势,以允许用户与各个项目进行交互。问题是,当我在列表中的任何位置(在项目上,在列表本身上)设置“onLongPressGesture”时,列表无法再滚动。我可以轻松地通过简单的点击来工作,但长按会阻止滚动。
我整理了一个小例子来说明这个问题:
struct ContentView: View
{
let data = [
"Test 1","Test 2","Test 3","Test 4","Test 5",
"Test 6","Test 7","Test 8","Test 9","Test 10",
"Test 11","Test 12","Test 13","Test 14","Test 15",
"Test 16","Test 17","Test 18","Test 19","Test 20"
]
var body: some View
{
List
{
ForEach(data,id:\.self)
{
item in
Text(item).onLongPressGesture{}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试在任何文本上拖动列表,列表将不会移动。如果我移除 longpress 处理程序,无论我按下哪里,它都会移动。
jen*_*odi 22
我也在苹果开发者论坛上问过这个问题,并得到了问题的解决方案。如果视图在 onLongPressGesture 之前定义了 onTapGesture 处理程序,则列表将是可滚动的,同时支持长按单个项目。
只要首先声明 onTapGesture 处理程序就可以为空。
struct ContentView: View
{
let data = [
"Test 1","Test 2","Test 3","Test 4","Test 5",
"Test 6","Test 7","Test 8","Test 9","Test 10",
"Test 11","Test 12","Test 13","Test 14","Test 15",
"Test 16","Test 17","Test 18","Test 19","Test 20"
]
var body: some View
{
List
{
ForEach(data,id:\.self)
{
item in
Text(item).onTapGesture{}.onLongPressGesture{}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
参考 @Jensrodi 的解决方案,因为它工作完美,尽管通过.onTapGesture在.onLongPressGesture.
为了缓解这种情况,您可以使用onLongPressGesture(minimumDuration:)减少/增加到您觉得舒服的持续时间。
请参阅下面的示例
List {
ForEach(0..<100) { x in
Text("List number -\(x)")
.onTapGesture{}.onLongPressGesture(minimumDuration: 0.2) { // Setting the minimumDuration to ~0.2 reduces the delay
print("long press \(x)")
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1417 次 |
| 最近记录: |