【问题标题】:SWRevealViewController add gesture to entire front viewSWRevealViewController 向整个前视图添加手势
【发布时间】:2013-07-24 00:21:50
【问题描述】:

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

【问题讨论】:

  • 为了让任何视图控制器实现滑动以显示活动,是否必须以某种方式与情节提要中的 RevealViewController 相互连接。我有问题吗?

标签: ios swrevealviewcontroller


【解决方案1】:

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

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

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

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

【讨论】:

  • 是的,它在 viewDidLoad 中工作。我错过了一件事。 [self.navigationController.navigationBar addGestureRecognizer:revealController.panGestureRecognizer] 行在 self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer] 行之后,并且有一个覆盖。我还可以向导航栏按钮和视图添加手势吗?
  • 我还可以在我的视图中添加内部手势触摸吗?或者代码中已经有了方法。我的意思是当前视图向左切换时。
  • @MatrosovAlexander 为什么还要在导航栏按钮上使用手势识别器?如果将其添加到导航栏,则整个导航栏都会获得手势识别器。通常,您希望该按钮仅将前视图切换到左侧。您可以为按钮设置一个操作方法:[self.revealViewController revealToggle:sender];,它将前视图切换到侧面,然后再返回。
  • 是的,我知道,但我也可以添加手势吗?谢谢
  • @MatrosovAlexander 我看不出你不能添加手势识别器的任何原因,尽管我不知道你为什么想要。
【解决方案2】:

//UPD:
似乎我以前的解决方案有点过头了,您只需调用 getter 即可获得默认行为。即

[revealViewController panGestureRecognizer];

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

- (void)viewDidLoad
{
    [super viewDidLoad];

    // adds gesture recognizer to the whole thing
    [self.view addGestureRecognizer:self.panGestureRecognizer];
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 虽然可行,但我认为更好的解决方案是将原始手势识别器添加到 self.navigationController.view 而不是 self.view
    【解决方案4】:

    要使用 SWRevealViewController 使用情节提要在整个前视图上添加手势,我们必须添加

     SWRevealViewController *revealController = [self revealViewController];
    [revealController panGestureRecognizer];
    [revealController tapGestureRecognizer];
    

    在应用程序的 FirstViewController 中。将 Action 和 Target 添加到导航栏按钮,如

    _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

    【讨论】:

      【解决方案5】:

      在斯威夫特上

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2019-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-05
          • 2015-12-07
          • 2021-04-18
          • 2016-09-08
          相关资源
          最近更新 更多