在允许更多触摸识别之前等待 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(...) 将事件(触摸)转发到响应链。独占视图不执行,可以不转发触摸事件。
canTouch = true;
中的代码将立即执行。因此,再次触摸(在很短的时间后)将 运行 放入您的 if()
语句中,因为您的 canTouch
现在为真。
您可以尝试将其移动到完成块,例如:
() => //completion
{
emptySpot = thisCenter;
canTouch = true;
});
这将避免其他触摸,直到此动画完成。
触摸子视图时,它会移动到主视图中的指定位置。在任何给定时间只应允许移动 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(...) 将事件(触摸)转发到响应链。独占视图不执行,可以不转发触摸事件。
canTouch = true;
中的代码将立即执行。因此,再次触摸(在很短的时间后)将 运行 放入您的 if()
语句中,因为您的 canTouch
现在为真。
您可以尝试将其移动到完成块,例如:
() => //completion
{
emptySpot = thisCenter;
canTouch = true;
});
这将避免其他触摸,直到此动画完成。