[英]SWRevealViewController add gesture to entire front view
现在我在我的项目中使用SWRevealViewController类。 基本功能允许我通过按导航栏按钮交换前视图。 但我想在整个视图中添加手势。
我可以添加此代码,它适用于我的按钮。
[self.startTestButton addGestureRecognizer:self.revealViewController.panGestureRecognizer];
但它只适用于一个UI元素。 所以我不能为这个手势添加其他UI元素。
下面的代码显示了如何编写panGestureRecognizer方法:
- (UIPanGestureRecognizer*)panGestureRecognizer
{
if ( _panGestureRecognizer == nil )
{
SWDirectionPanGestureRecognizer *customRecognizer =
[[SWDirectionPanGestureRecognizer alloc] initWithTarget:self action:@selector(_handleRevealGesture:)];
customRecognizer.direction = SWDirectionPanGestureRecognizerHorizontal;
customRecognizer.delegate = self;
_panGestureRecognizer = customRecognizer ;
}
return _panGestureRecognizer;
}
要将手势识别器添加到整个视图,只需将其添加到整个视图而不是单个按钮。 我正在使用SWRevealViewController
,我的主视图是一个UITableView
所以要让手势识别器在整个视图上工作,我在UIViewController
的viewDidLoad
方法中有这个:
[self.tableView addGestureRecognizer: self.revealViewController.panGestureRecognizer];
因此,只需将识别器添加到您喜欢的视图中即可。 对于大多数UIViewContoller
这将是self.view
。
显然,如果视图的任何控件或子视图具有自己的手势识别器,则这些将优先于顶级视图上的那个,这样平移将仅在未被这些子视图占据的区域中工作。
// UPD:
似乎我以前的解决方案是一种矫枉过正,你可以调用getter来获取默认行为。 即
[revealViewController panGestureRecognizer];
//旧解决方案
您还可以将SWRevealViewController
的panGestureRecognizer
添加到它自己的视图中,例如在您可能具有的SWRevealViewController
的子类中:
- (void)viewDidLoad
{
[super viewDidLoad];
// adds gesture recognizer to the whole thing
[self.view addGestureRecognizer:self.panGestureRecognizer];
}
如果您正在使用导航控制器并尝试将手势识别器添加到self.view,则在导航栏上滑动时手势将不会响应。 我做的是进入SWReaveal类并添加第二个手势识别器。 所以现在我在self.view中添加一个识别器,在导航栏中添加一个识别器。 完美的工作。 如果你需要它我可以共享代码,但它不应该太难
要使用故事板使用SWRevealViewController在整个前视图上添加Gesture,我们必须添加
SWRevealViewController *revealController = [self revealViewController];
[revealController panGestureRecognizer];
[revealController tapGestureRecognizer];
在应用程序的FirstViewController中。 将操作和目标添加到导航栏按钮,如
_sidebarButton.target = self.revealViewController;
_sidebarButton.action = @selector(revealToggle:);
// Set the gesture
[self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
在SWRevealViewController.h中添加以下方法
- (UITapGestureRecognizer*)tapGestureRecognizer;
- (BOOL)revealControllerTapGestureShouldBegin:(SWRevealViewController *)revealController;
在SWRevealViewController.m中添加
- (UITapGestureRecognizer*)tapGestureRecognizer
{
if ( _tapGestureRecognizer == nil )
{
UITapGestureRecognizer *tapRecognizer =
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_handleTapGesture:)];
tapRecognizer.delegate = self;
[_contentView.frontView addGestureRecognizer:tapRecognizer];
_tapGestureRecognizer = tapRecognizer ;
}
return _tapGestureRecognizer;
}
- (void)_handleTapGesture:(UITapGestureRecognizer *)recognizer
{
NSTimeInterval duration = _toggleAnimationDuration;
[self _setFrontViewPosition:FrontViewPositionLeft withDuration:duration];
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
if ( _animationQueue.count == 0 )
{
if ( gestureRecognizer == _panGestureRecognizer )
// return [self _panGestureShouldBegin];
return ( gestureRecognizer == _panGestureRecognizer && _animationQueue.count == 0) ;
if ( gestureRecognizer == _tapGestureRecognizer )
return [self _tapGestureShouldBegin];
}
return NO;
}
如果是xib,您可以直接使用
在斯威夫特
self.revealViewController().frontViewController.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
如果您在前视图中使用导航控制器,则可以将平移手势添加到导航控制器的视图中,如下所示
[self.navigationController.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
这样,您也可以在导航栏上滑动而无需更改SWReveal控制器的任何类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.