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 - 基于垂直 ScrollViewbody 的工作变体(在下面的模块中替换)

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 事件如何限制仅检测水平/垂直滚动的主要内容,如果未能解决你的问题,请参考以下文章

如何在 macOS 上检测 SwiftUI 中的键盘事件?

如何在 UIScrollView 上检测“Drag Enter”

您如何检测没有移动或持续时间的 SwiftUI touchDown 事件?

如何使用 SwiftUI 和 Combine 检测 Datepicker 的值变化?

如何限制 ForEach 在 SwiftUI 中显示一组项目?

如何检测dragLeave