SwiftUI Drag 事件如何限制仅检测水平/垂直滚动
Posted
技术标签:
【中文标题】SwiftUI Drag 事件如何限制仅检测水平/垂直滚动【英文标题】:SwiftUI Drag events how do restrict to detect only horizontal/vertical scrolls 【发布时间】:2019-12-05 17:57:20 【问题描述】:我有带有嵌套 ScrollView(或附加了拖动的视图)的 List(垂直滚动)。我希望嵌套视图 onDrag() 仅在水平滚动而不是垂直滚动时被检测到。垂直滚动应传播到包装器列表。
【问题讨论】:
【参考方案1】:好吧,下面的垂直列表内的水平滚动视图演示应该可以正常工作,除非 List 目前已知“刷新”缺陷。所以...我决定发布它只是为了演示...也许在下一次 SwiftUI/ios 更新时它会自动修复。
我还在垂直滚动视图中提供了水平滚动视图的变体,作为List
问题的解决方法。希望这些对您有所帮助。
所以,“垂直拖动任何地方传播到垂直滚动容器,水平拖动仅在水平滚动视图中有效”的演示代码
A - 基于垂直 ScrollView
的 body
的工作变体(在下面的模块中替换)
var body: some View
ScrollView(.vertical, showsIndicators: false)
VStack(alignment: .leading)
ForEach (0..<20, id: \.self) i in
VStack
self.rowItem(index: i)
Divider()
B - 带有列表的“工作”变体(存在刷新问题)
struct TestScrollInList: View
var body: some View
List
ForEach (0..<20, id: \.self) i in
self.rowItem(index: i)
func rowItem(index i: Int) -> AnyView
if i % 2 == 0
return AnyView(self.plainItem(index: i))
else
return AnyView(self.scrollableItem(index: i))
func plainItem(index i: Int) -> some View
Text("Plain item \(i)")
func scrollableItem(index i: Int) -> some View
ScrollView (.horizontal, showsIndicators: false)
HStack
ForEach(0..<10) j in
RoundedRectangle(cornerRadius: 8)
.fill(j % 2 == 0 ? Color.green : Color.yellow)
.frame(width: 100, height: 100)
.frame(maxHeight: 110)
struct TestScrollInList_Previews: PreviewProvider
static var previews: some View
TestScrollInList()
【讨论】:
以上是关于SwiftUI Drag 事件如何限制仅检测水平/垂直滚动的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UIScrollView 上检测“Drag Enter”
您如何检测没有移动或持续时间的 SwiftUI touchDown 事件?
如何使用 SwiftUI 和 Combine 检测 Datepicker 的值变化?