现在我在我的项目中使用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;
}
答案 0 :(得分:9)
要将手势识别器添加到整个视图,只需将其添加到整个视图,而不是仅添加一个按钮。我正在使用SWRevealViewController
,我的主视图是UITableView
所以为了让手势识别器能够处理整个视图,我在viewDidLoad
UIViewController
方法中使用了这个方法:
[self.tableView addGestureRecognizer: self.revealViewController.panGestureRecognizer];
因此,只需将识别器添加到您喜欢的视图中即可。对于大多数UIViewContoller
,这将是self.view
。
显然,如果视图的任何控件或子视图都有自己的手势识别器,这些将优先于顶级视图中的那个,这样平移只能在未被这些子视图占用的区域中工作。
答案 1 :(得分:2)
// UPD:
似乎我以前的解决方案是一种矫枉过正,你可以调用getter来获取默认行为。即。
[revealViewController panGestureRecognizer];
//旧解决方案
您还可以将SWRevealViewController
的{{1}}添加到自己的视图中,例如在您可能拥有的panGestureRecognizer
子类中:
SWRevealViewController
答案 2 :(得分:1)
如果您正在使用导航控制器并尝试将手势识别器添加到self.view,则在导航栏上滑动时手势不会响应。我做的是进入SWReaveal类并添加第二个手势识别器。所以现在我在self.view中添加一个识别器,在导航栏中添加一个识别器。完美的工作。如果你需要,我可以共享代码,但它不应该太难
答案 3 :(得分:1)
要使用故事板使用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,您可以直接使用
答案 4 :(得分:1)
On Swift
self.revealViewController().frontViewController.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
答案 5 :(得分:0)
如果您在前视图中使用导航控制器,则可以将平移手势添加到导航控制器的视图中
[self.navigationController.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
这样你也可以在导航栏上滑动而不改变SWReveal控制器的任何类。