iOS:如何从 Swift class 触发 Obj-C 中的 UITapGestureRecognizer 和 UIPanGestureRecognizer?
iOS: How to trigger a UITapGestureRecognizer & UIPanGestureRecognizer in Obj-C from a Swift class?
我使用 SWRevealViewController,我想在 Obj-C class 和 Swift class 的混合中使用它。它在 Swift 中的 Obj-C class 中运行良好,但我的问题是获取左侧菜单的滑动方法无效(按钮有效但滑动无效):
Obj-C 要在 viewController 开头添加代码以使其工作:
//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 要在 viewController 开头添加代码以使其工作:
//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)
}
}
这里是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;
}
这在 swift 视图中有效,但这不是我想要的。我希望从 swift 视图触发 gestureRecognizer Obj-c SWRevealViewController:
//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!!!!")
}
提前致谢...
解决方法如下:
@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
在此处查找:Tutorial
我使用 SWRevealViewController,我想在 Obj-C class 和 Swift class 的混合中使用它。它在 Swift 中的 Obj-C class 中运行良好,但我的问题是获取左侧菜单的滑动方法无效(按钮有效但滑动无效):
Obj-C 要在 viewController 开头添加代码以使其工作:
//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 要在 viewController 开头添加代码以使其工作:
//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)
}
}
这里是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;
}
这在 swift 视图中有效,但这不是我想要的。我希望从 swift 视图触发 gestureRecognizer Obj-c SWRevealViewController:
//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!!!!")
}
提前致谢...
解决方法如下:
@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
在此处查找:Tutorial