你能覆盖 Navigation Controllers 'InteractivePopGestureRecognizer' 动作吗?
Can you override the Navigation Controllers 'InteractivePopGestureRecognizer' action?
我正在寻找实现滑动手势识别器的方法,该识别器仅在您从屏幕的外侧向右滑动时触发。我们需要打开自定义 SideMenu 的手势。我尝试使用一个简单的 UISwipeGestureRecognizer
并将 SwipeDirection
属性 设置为右侧,但无论滑动的起点是什么,每次从左向右滑动都会触发。
理想情况下,我们希望它的动画看起来和感觉起来像 UINavigationController
的 InteractivePopGestureRecognizer
。我们已经在使用 NavigationController,它将 MainView 推到 IntroView 之上。现在,我们禁用 InteractivePopGestureRecognizer
,因此您无法返回 IntroView。那是我们的问题。如果可能的话,我们不想禁用 NavigationController
的手势,而是改变它的动作。所以从屏幕最左边向右滑动不会弹出当前viewcontroller
,而是打开我们的SideMenu
是否可以覆盖 InteractivePopGestureRecognizer
来改变它的动作?如果这不可能,您是否有关于如何创建完全相同的手势识别器的其他想法?它必须以某种方式成为可能,因为如果您的手势起点是屏幕的左侧(或右侧),许多应用程序只会打开它们的 SideMenu。 (例如 Reddit)
提前感谢您的帮助。
您可以使用 Touch Events 和 UISwipeGestureRecognizer 来做到这一点。
workaround 覆盖TouchesBegan
方法来检测起始点是否符合您的需要,如果是则添加UISwipeGestureRecognizer
for View。
SwipeGestureRecognizer rightSwipeGesture;
public override void TouchesBegan (NSSet touches, UIEvent evt)
{
base.TouchesBegan (touches, evt);
UITouch touch = touches.AnyObject as UITouch;
if (touch != null)
{
//code here to handle touch
CoreGraphics.CGPoint swipPoint = touch.LocationInView(View);
if(swipPoint.X < 0.5)
{
rightSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Right };
rightSwipeGesture.Swiped += OnSwiped;
View.AddGestureRecognizers(rightSwipeGesture);
}
}
}
public override void TouchesEnded (NSSet touches, UIEvent evt)
{
base.TouchesBegan (touches, evt);
if(null != rightSwipeGesture ){
rightSwipeGesture.Swiped -= OnSwiped;
View.RemoveGestureRecognizers(rightSwipeGesture);
}
}
=============================更新=============== ==================
我找到了一个解决方法,只使用一个 GestureRecognizer 就可以了。你可以看看UIScreenEdgePanGestureRecognizer。虽然它是一个平移手势,但是如果您不使用添加的视图处理某些事情,它将作为滑动手势工作。另外,UIScreenEdgePanGestureRecognizer 只能在屏幕边缘工作。您可以设置 Left
边缘来满足您的需求。
例如:
UIScreenEdgePanGestureRecognizer panRightGestureRecognizer = new UIScreenEdgePanGestureRecognizer();
panRightGestureRecognizer.Edges = UIRectEdge.Left;
panRightGestureRecognizer.AddTarget(() => HandleSwap(panRightGestureRecognizer));
View.AddGestureRecognizer(panRightGestureRecognizer);
private void HandleSwip(UIScreenEdgePanGestureRecognizer panRightGestureRecognizer)
{
Point point = (Point)panRightGestureRecognizer.TranslationInView(View);
if (panRightGestureRecognizer.State == UGestureRecognizerState.Began)
{
Console.WriteLine("Show slider view");
}
}
我正在寻找实现滑动手势识别器的方法,该识别器仅在您从屏幕的外侧向右滑动时触发。我们需要打开自定义 SideMenu 的手势。我尝试使用一个简单的 UISwipeGestureRecognizer
并将 SwipeDirection
属性 设置为右侧,但无论滑动的起点是什么,每次从左向右滑动都会触发。
理想情况下,我们希望它的动画看起来和感觉起来像 UINavigationController
的 InteractivePopGestureRecognizer
。我们已经在使用 NavigationController,它将 MainView 推到 IntroView 之上。现在,我们禁用 InteractivePopGestureRecognizer
,因此您无法返回 IntroView。那是我们的问题。如果可能的话,我们不想禁用 NavigationController
的手势,而是改变它的动作。所以从屏幕最左边向右滑动不会弹出当前viewcontroller
,而是打开我们的SideMenu
是否可以覆盖 InteractivePopGestureRecognizer
来改变它的动作?如果这不可能,您是否有关于如何创建完全相同的手势识别器的其他想法?它必须以某种方式成为可能,因为如果您的手势起点是屏幕的左侧(或右侧),许多应用程序只会打开它们的 SideMenu。 (例如 Reddit)
提前感谢您的帮助。
您可以使用 Touch Events 和 UISwipeGestureRecognizer 来做到这一点。
workaround 覆盖TouchesBegan
方法来检测起始点是否符合您的需要,如果是则添加UISwipeGestureRecognizer
for View。
SwipeGestureRecognizer rightSwipeGesture;
public override void TouchesBegan (NSSet touches, UIEvent evt)
{
base.TouchesBegan (touches, evt);
UITouch touch = touches.AnyObject as UITouch;
if (touch != null)
{
//code here to handle touch
CoreGraphics.CGPoint swipPoint = touch.LocationInView(View);
if(swipPoint.X < 0.5)
{
rightSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Right };
rightSwipeGesture.Swiped += OnSwiped;
View.AddGestureRecognizers(rightSwipeGesture);
}
}
}
public override void TouchesEnded (NSSet touches, UIEvent evt)
{
base.TouchesBegan (touches, evt);
if(null != rightSwipeGesture ){
rightSwipeGesture.Swiped -= OnSwiped;
View.RemoveGestureRecognizers(rightSwipeGesture);
}
}
=============================更新=============== ==================
我找到了一个解决方法,只使用一个 GestureRecognizer 就可以了。你可以看看UIScreenEdgePanGestureRecognizer。虽然它是一个平移手势,但是如果您不使用添加的视图处理某些事情,它将作为滑动手势工作。另外,UIScreenEdgePanGestureRecognizer 只能在屏幕边缘工作。您可以设置 Left
边缘来满足您的需求。
例如:
UIScreenEdgePanGestureRecognizer panRightGestureRecognizer = new UIScreenEdgePanGestureRecognizer();
panRightGestureRecognizer.Edges = UIRectEdge.Left;
panRightGestureRecognizer.AddTarget(() => HandleSwap(panRightGestureRecognizer));
View.AddGestureRecognizer(panRightGestureRecognizer);
private void HandleSwip(UIScreenEdgePanGestureRecognizer panRightGestureRecognizer)
{
Point point = (Point)panRightGestureRecognizer.TranslationInView(View);
if (panRightGestureRecognizer.State == UGestureRecognizerState.Began)
{
Console.WriteLine("Show slider view");
}
}