4

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

6 回答 6

9

要将手势识别器添加到整个视图,只需将其添加到整个视图而不是单个按钮。我正在使用SWRevealViewController,我的主要视图是UITableView让手势识别器在整个视图上工作我在viewDidLoad我的方法中有这个UIViewController

[self.tableView addGestureRecognizer: self.revealViewController.panGestureRecognizer];

因此,只需将识别器添加到您喜欢的视图中即可。对于大多数人来说UIViewContoller,这将是self.view

显然,如果视图的任何控件或子视图具有自己的手势识别器,它们将优先于顶层视图,这样平移将仅在那些子视图未占用的区域中起作用。

于 2013-07-24T13:36:01.513 回答
2

//UPD:
似乎我以前的解决方案有点过头了,你可以调用 getter 来获取默认行为。IE

[revealViewController panGestureRecognizer];

// 旧解决方案
您也可以将SWRevealViewController's添加panGestureRecognizer到它自己的视图中,例如在您的子类中SWRevealViewController可能有:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // adds gesture recognizer to the whole thing
    [self.view addGestureRecognizer:self.panGestureRecognizer];
}
于 2014-02-19T12:39:47.767 回答
1

如果您使用导航控制器并尝试将手势识别器添加到 self.view,则在导航栏上滑动时手势不会响应。我所做的是进入 SWRaveal 类并添加第二个手势识别器。所以现在我向 self.view 添加一个识别器,向导航栏添加一个识别器。完美运行。如果您需要,我可以共享代码,但应该不会太难

于 2013-07-25T14:12:45.190 回答
1

要使用故事板使用 SWRevealViewController 在整个前视图上添加手势,我们必须添加

 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

于 2014-11-20T05:43:20.097 回答
1

斯威夫特

self.revealViewController().frontViewController.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
于 2017-03-21T07:03:09.077 回答
0

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

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

这样,您也可以在导航栏上滑动,而无需更改 SWReveal 控制器的任何类。

于 2014-07-31T15:18:03.497 回答