在允许更多触摸识别之前等待 TouchesEnded 中的操作完成 - Xamarin iOS

Wait for actions in TouchesEnded to complete before allowing more touch recognition - Xamarin iOS

触摸子视图时,它会移动到主视图中的指定位置。在任何给定时间只应允许移动 1 子视图。问题是,如果我同时触摸两个子视图 at/nearly(例如,如果用户在移动设备上使用两个拇指),多个 子视图会同时移动。

我想如果touches == 1,我就不会有这个问题了。 我实现了一个全局 bool 但这也没有解决它。

有什么建议吗?谢谢!

更新 我用 ExclusiveTouch 解决了一半的问题:当同时触摸两个子视图时,只有一个动作。但是,如果两次触摸之间的时间非常短,两个子视图仍然会移动。也许它与移动图块的 0.15 秒动画有关?就像一个在另一个完成之前开始?

    ...
    bool canTouch = true;
    ...

            public override void TouchesEnded(NSSet touches, UIEvent evt)
            {
                if (canTouch)
                {
                    canTouch = false;

                    base.TouchesEnded(touches, evt);

                    int touchesCount = (int)touches.Count;

                    if (touchesCount == 1)
                    {
                        UITouch myTouch = (UITouch)touches.AnyObject;
                        UIView touchedView = myTouch.View;

                        // Move 1 touched view...
                        UIView.Animate(.15f,
                                               () => //animation
                                               {
                                                   touchedView.Center = 
                        emptySpot;
                                               },
                                               () => //completion
                                               {
                                                   emptySpot = thisCenter;
                                               });
                            }
                    }

                    canTouch = true;
                }
            }

你试过yourView.MultipleTouchEnabled = false;了吗?
或者从 iOS Designer 的视图面板中禁用它?

更新 对于快速触摸场景,我会尝试将触摸捕获在 "upper" 视图中,而不在代码周围添加额外的 bool 变量。

public override void TouchesBegan (NSSet touches, UIEvent evt)
{
    if (! ExclusiveTouch) 
        base.TouchesBegan (touches, evt);
}

UIViews 派生自 UIResponders,它通过覆盖方法中的 base(...)/super(...) 将事件(触摸)转发到响应链。独占视图不执行,可以不转发触摸事件。

Documentation

canTouch = true;中的代码将立即执行。因此,再次触摸(在很短的时间后)将 运行 放入您的 if() 语句中,因为您的 canTouch 现在为真。

您可以尝试将其移动到完成块,例如:

() => //completion
{
    emptySpot = thisCenter;
    canTouch = true;
});

这将避免其他触摸,直到此动画完成。