SWRevealViewController将手势添加到整个前视图

时间:2013-07-24 13:29:20

标签: ios swrevealviewcontroller

现在我在我的项目中使用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;
}

6 个答案:

答案 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,您可以直接使用

https://github.com/John-Lluch/SWRevealViewController

答案 4 :(得分:1)

On Swift

self.revealViewController().frontViewController.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())

答案 5 :(得分:0)

如果您在前视图中使用导航控制器,则可以将平移手势添加到导航控制器的视图中

[self.navigationController.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];

这样你也可以在导航栏上滑动而不改变SWReveal控制器的任何类。