繁体   English   中英

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

[英]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所以要让手势识别器在整个视图上工作,我在UIViewControllerviewDidLoad方法中有这个:

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

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

显然,如果视图的任何控件或子视图具有自己的手势识别器,则这些将优先于顶级视图上的那个,这样平移将仅在未被这些子视图占据的区域中工作。

// UPD:
似乎我以前的解决方案是一种矫枉过正,你可以调用getter来获取默认行为。

[revealViewController panGestureRecognizer];

//旧解决方案
您还可以将SWRevealViewControllerpanGestureRecognizer添加到它自己的视图中,例如在您可能具有的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,您可以直接使用

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

在斯威夫特

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM