Search code examples
iosobjective-cswiftuigesturerecognizeruitapgesturerecognizer

iOS: How to trigger a UITapGestureRecognizer & UIPanGestureRecognizer in Obj-C from a Swift class?


I use the SWRevealViewController, and I would like to use it in a mix of Obj-C class and Swift class. It works well in the Obj-C class in Swift but my problem is that the swipe method to get the menu on the left is not working (the button is working but not the swipe):

Obj-C code to add at the beginning of the viewController to make it work :

   //Side MEnu
    SWRevealViewController *revealViewController = self.revealViewController;
    if ( revealViewController )
    {
        SWRevealViewController *revealVC = self.revealViewController;
        if (![revealVC uniqueNavController])
        {
            [revealVC setUniqueNavController:self.navigationController];
        }
        [_menuAction addTarget:self.revealViewController action:@selector(revealToggle:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
        [_menuAction setImage:[UIImage imageNamed:@"Menu_burger_Clicked.png"] forState:UIControlStateHighlighted];

        UITapGestureRecognizer *tap = [revealViewController tapGestureRecognizer];
        tap.delegate = self;
        [self.view addGestureRecognizer:tap];
    }

Swift code to add at the beginning of the viewController to make it work:

 //Side MEnu
        let revealViewController: SWRevealViewController? = SWRevealViewController()
        if revealViewController != nil {
            let revealVC: SWRevealViewController? = revealViewController
            if revealVC?.uniqueNavController == nil {
                revealVC?.uniqueNavController = navigationController
            }
            menuAction.addTarget(revealViewController, action: #selector(SWRevealViewController.revealToggle(_:)), for: .touchUpInside)
            view.addGestureRecognizer(revealViewController!.panGestureRecognizer())
            menuAction.setImage(UIImage(named: "Menu_burger_Clicked.png"), for: .highlighted)

            let tap: UITapGestureRecognizer? = revealViewController?.tapGestureRecognizer
            tap?.delegate = self as? UIGestureRecognizerDelegate
            if let aTap = tap {
                self.view.addGestureRecognizer(aTap)
            }
        }

Here is the function to be triggered in the SWRevealViewController.m

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)recognizer
{
    // only allow gesture if no previous request is in process
    if ( _animationQueue.count == 0 )
    {
        if ( recognizer == _panGestureRecognizer )
            return [self _panGestureShouldBegin];

        if ( recognizer == _tapGestureRecognizer )
            return [self _tapGestureShouldBegin];
    }

    return NO;
}

enter image description here

This works in the swift view, but this is not what I want. I want the gestureRecognizer Obj-c SWRevealViewController to be triggered from that swift view:

        //PanGesture
        let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.handlePan(recognizer:)))
        self.view.addGestureRecognizer(panGestureRecognizer)

        //TapGesture
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(recognizer:)))
        self.view.addGestureRecognizer(tapGestureRecognizer)

func handlePan(recognizer: UIPanGestureRecognizer) {
    print("PAN WORKING!!!!")
}
func handleTap(recognizer: UIPanGestureRecognizer) {
    print("TAP WORKING!!!!")
}

Thanks in advance...


Solution

  • Here is the solution:

    @objc class PlanningViewController: UIViewController, UIGestureRecognizerDelegate, UINavigationControllerDelegate {
    
    
        #if SIDE_MENU
            //Side MEnu
            let revealViewController: SWRevealViewController = SWRevealViewController()
            let revealVC: SWRevealViewController = revealViewController
            if revealVC.uniqueNavController == nil
            {
                revealVC.uniqueNavController = navigationController
            }
            menuAction.addTarget(revealViewController, action: #selector(SWRevealViewController.revealToggle(_:)), for: .touchUpInside)
            menuAction.setImage(UIImage(named: "Menu_burger_Clicked.png"), for: .highlighted)
    
            if self.revealViewController() != nil
            {
                self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
                self.view.addGestureRecognizer(self.revealViewController().tapGestureRecognizer)
            }
        #endif
    

    Find here : Tutorial