*当前*正在触摸哪个 SwiftUI 节点?

Posted

技术标签:

【中文标题】*当前*正在触摸哪个 SwiftUI 节点?【英文标题】:Which SwiftUI node is *currently* being touched? 【发布时间】:2020-05-09 20:07:34 【问题描述】:

TLDR;如果用户在多个节点上拖动手指,如何获取他们在拖动时触摸的所有节点?

我正在尝试构建一个类似 Wordsearch 的游戏,以在 ios 上自学 SwiftUI。

我已经构建了一个如图所示的图块网格(忽略蓝色图块,因为它们与我的问题无关)。

我希望用户在网格上拖动他们的手指,并且对于他们滑过的每个图块,我会在我的模型上调用一个方法来将该图块标记为“已选择”。

我已经在每个图块的视图上尝试了 DragGesture,就像这样;

.gesture(
    DragGesture()
    .onChanged  _ in

        myModel.SelectTile(self.tile.id);
    
)

但是,当用户的手指从起始图块移出并进入下一个图块时,直到用户抬起手指并在该图块上开始新手势时,下一个节点的拖动手势才会生效。

SwiftUI 可以实现这种行为吗?我意识到我可以使用 SpriteKit 更轻松地做到这一点,但这对于这种“游戏”来说似乎有点过头了。

【问题讨论】:

【参考方案1】:

我找到了另一种方法来完成我所需要的;

通过将 DragGesture 应用于网格本身;我可以在网格中获取触摸位置。

因此,一些简单的划分和地板给了我在网格中被触摸的瓷砖的位置,就像这样;

.gesture(

    DragGesture(minimumDistance: 0)
    .onChanged  _gesture in

        let tileSize = geometry.size.width / CGFloat(self.game.grid.width);

        let x : Int = Int(_gesture.location.x / tileSize);
        let y : Int = Int(_gesture.location.y / tileSize);

        self.game.SelectTile(_x: x, _y: y);
    
)

【讨论】:

以上是关于*当前*正在触摸哪个 SwiftUI 节点?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 按钮的可触摸区域

ios14 Xcode 12 - 触摸 SwiftUI 对象时精灵不显示,但触摸 SKScene 时工作

SwiftUI 中“触摸输入”的手势

如何跨 SwiftUI 应用程序跟踪所有触摸

SwiftUI - 使列表分隔线扩展到触摸屏边缘

当用户在 SwiftUI 中触摸 GoogleMaps 的标记时如何更改 UI 状态?