你能覆盖 Navigation Controllers 'InteractivePopGestureRecognizer' 动作吗?

Can you override the Navigation Controllers 'InteractivePopGestureRecognizer' action?

我正在寻找实现滑动手势识别器的方法,该识别器仅在您从屏幕的外侧向右滑动时触发。我们需要打开自定义 SideMenu 的手势。我尝试使用一个简单的 UISwipeGestureRecognizer 并将 SwipeDirection 属性 设置为右侧,但无论滑动的起点是什么,每次从左向右滑动都会触发。

理想情况下,我们希望它的动画看起来和感觉起来像 UINavigationControllerInteractivePopGestureRecognizer。我们已经在使用 NavigationController,它将 MainView 推到 IntroView 之上。现在,我们禁用 InteractivePopGestureRecognizer,因此您无法返回 IntroView。那是我们的问题。如果可能的话,我们不想禁用 NavigationController 的手势,而是改变它的动作。所以从屏幕最左边向右滑动不会弹出当前viewcontroller,而是打开我们的SideMenu

是否可以覆盖 InteractivePopGestureRecognizer 来改变它的动作?如果这不可能,您是否有关于如何创建完全相同的手势识别器的其他想法?它必须以某种方式成为可能,因为如果您的手势起点是屏幕的左侧(或右侧),许多应用程序只会打开它们的 SideMenu。 (例如 Reddit)

提前感谢您的帮助。

您可以使用 Touch EventsUISwipeGestureRecognizer 来做到这一点。

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");
     }
}