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;
}
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...
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