gpt4 book ai didi

iphone - 如何在 iOS 设备上滑动手势期间 "catch" subview ?

转载 作者:行者123 更新时间:2023-12-01 18:03:16 25 4
gpt4 key购买 nike

我正在构建一个 iOS 棋盘游戏(类似于拼字游戏或单词),其中涉及在屏幕上移动小块,我发现用户有时很难触摸和移动 block ,因为它们太小了。由于游戏的设计,我无法增加图 block 的大小,所以我不得不实现一些小技巧,让用户更容易触摸和移动图 block ,而且效果很好。剩下的唯一问题是用户有时只触及磁贴之外,当用户尝试移动它时,磁贴会停留在原处。

对于如何解决这个问题,我有两个想法......

  • 如果用户触摸屏幕时没有触摸磁贴,我可以使用父 View 的触摸位置来找到离触摸位置最近的磁贴,并以某种方式将触摸事件转发到该磁贴的 View 。
  • 如果用户触摸屏幕时没有触摸磁贴,我可以在用户尝试移动时将手指拖过磁贴时以某种方式“捕捉”该磁贴。

  • 我更愿意实现解决方案#2,因为解决方案#1 有太多相关的问题,更不用说解决方案#2 是一种更现实的体验。也就是说,当用户将手指拖到瓷砖上并发送触摸事件以将其移动到手指所在的位置时,我如何“捕捉”瓷砖?

    目前,我的图 block 被实现为 UIView 的子类,它们直接处理触摸事件(touchesBegain、touchesMoved 和 touchesEnded)。因此,如果用户刚刚触摸到 View 之外并将手指拖到 View 上,它不会收到任何触摸事件,因为它没有收到初始的 touchesBegan 事件。

    提前感谢您的智慧!

    最佳答案

    也许您应该让“板” View 处理所有拖动。当触摸开始并且在该点有一个图 block 时,然后开始拖动它。否则,在触摸移动时检查,一旦找到磁贴,就开始拖动它。

    您可以覆盖 hitTest:withEvent:在板 View 中,以便它仍然可以检测触摸何时触及瓷砖,但始终返回自身,以便触摸事件进入板 View (例如,将被击中的 subview 记录在单独的成员变量中,以便您知道要做什么当触摸事件开始进入时开始拖动)。

    更多详情

    处理触摸时,UIView 将使用 hitTest 来查找应该接收触摸事件的 View 。默认实现会检查每个 subview ,以便层次结构中的“最深” subview 得到影响。为了让板 View 接收触摸,您必须在所有平铺 View 上禁用 userInteraction。但这意味着您不能使用 hitTest 来查找被触摸的图 block ,因为它忽略了禁用 userInteraction 的 View 。

    所以我要说的是在触摸 View 上启用 userInteraction。但是覆盖板 View 上的 hitTest 以便它首先调用 super 实现以查找图 block (如果结果是 self ,则板本身被击中)。无需实现您自己的图 block 搜索。像这样的东西:

    - (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
    {
    UIView *hitView = [super hitTest:point withEvent:event];
    if ( hitView != self )
    self.draggingTile = hitView;
    return self;
    }

    现在您知道要移入什么瓷砖了 touchesMoved .但是,我认为在触摸移动时不会调用 hitTest,因此如果尚未拾取任何图 block ,您可能必须手动调用它(您可以从传递给的触摸中获取 pointevent touchesMoved

    关于iphone - 如何在 iOS 设备上滑动手势期间 "catch" subview ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4430995/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com