【问题标题】:How to block uipangesturerecognizer in uitableviewcell when table view scrolling表格视图滚动时如何在uitableviewcell中阻止uipangesturerecognizer
【发布时间】:2014-04-23 13:36:59
【问题描述】:

我有带有结构的自定义单元格的表格视图 (ContentView->UIView(name Regulator))

UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panRecognized:)];
[panRecognizer setDelegate:self];
[self.Regulator addGestureRecognizer:panRecognizer];

当我在我的手指下滚动 tableView 单元格时,panRecognizer 也会移动。仅当 tableview 停止滚动时,我才需要在单元格中滚动

【问题讨论】:

    标签: ios objective-c uitableview uipangesturerecognizer


    【解决方案1】:

    迅捷解决方案: 下面是我的代码 sn-p,它在 swift 3.0 中运行良好

    //这个方法帮助我停止了 UITableviewCell 的上/下 pangesture 并且只允许垂直滚动

    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        if let panGestureRecognizer = gestureRecognizer as? UIPanGestureRecognizer {
            let translation = panGestureRecognizer.translation(in: superview!)
            if abs(translation.x) > abs(translation.y) {
                return true
            }
            return false
        }
        return false
    }
    

    【讨论】:

    • 你是我的个人英雄! :)
    【解决方案2】:

    检查表格视图是否正在滚动:

    if (!tableView.isDragging && !tableView.isDecelerating)
    {
       // the table is *not* scrolling implement you logic here 
    }
    

    【讨论】:

    • "panRecognized" 方法定义在单元格中,而不是在视图控制器中。 Cell 不知道 tableView。
    • 将此添加到您的 panRecognized: 方法中以检查是否首先滚动表视图。
    • 当您在 cellForRow AtIndexPath 方法中定义 panRecognizer 时,您还定义了检测到此手势时要调用的方法。在您的情况下,这是 -(void)panRecognized:(UIPanGestureRecognizer *)panGesture 方法。那是对的吗?如果很简单,请插入此 if 语句并在其中执行。您的视图控制器引用了您的表格视图。您的单元格中不需要此引用
    • 不,不在 cellForRowAtIndexPath 中。单元格中定义的方法。细胞自行管理。
    【解决方案3】:

    UITableViewUIScrollView 的子类。所以,在你的 panRecognized 方法中,你可以检查一下,

    -(void) panRecognized :(UIPanGestureRecognizer *) gesture
    {
        if([tableView isDecelerating] == FALSE)
        {
              //Do your stuff...
        }
    }
    

    【讨论】:

    • "panRecognized" 方法定义在单元格中,而不是在视图控制器中。 Cell 不知道 tableView。
    【解决方案4】:

    您应该始终在视图控制器中而不是在 UITableViewCell 类中实现此类代码。

    这是一个有点老套的方法,我不会使用它,但应该可以为你解决问题

    首先将私有实例添加到 tableView 对象

    @implementation MyCustomCell
    {
      UITableView *tblView;
    }
    

    在您的代码中:

    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panRecognized:)];
    [panRecognizer setDelegate:self];
    [self.Regulator addGestureRecognizer:panRecognizer];
    

    添加这行代码:

    tblView = [[self superview]superview];
    

    然后在您的 panRecognized 方法中,您可以执行以下检查:

    if(!tblView.isDragging && !tblView.isDecelerating)
    {
      // do your stuff here
    }
    

    我再次建议您在 viewController 中执行此操作。编码愉快!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      相关资源
      最近更新 更多