UITableViewcell 和 UITableVIew 上的手势识别器

Posted

技术标签:

【中文标题】UITableViewcell 和 UITableVIew 上的手势识别器【英文标题】:gesture recognizers on both UITableViewcell and UITableVIew 【发布时间】:2013-06-09 10:59:13 【问题描述】:

我有一个简单的 UITableViewCell 实现。 我已经为 UIPanGestureRecognizer 注册了 UITableViewCell 的这个子类,我用它来向右或向左滑动单元格。

//在UITableViewCell子类中:

 UIGestureRecognizer* recognizer = 
 [[UIPanGestureRecognizer alloc] initWithTarget:
 self   
 action:@selector(handlePan:)];

    recognizer.delegate = self;
    [self addGestureRecognizer:recognizer];
       recognizer.cancelsTouchesInView = NO;

现在我想在用户用两根手指“向上”滑动时呈现一个视图控制器 屏幕上。 所以,我在 tableview 中添加了一个 UISwipeGestureRecognizer。

// 包含 tableview 引用的视图控制器中的代码。

UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleViewsSwipe:)];

            [swipe setDirection:UISwipeGestureRecognizerDirectionUp];
            [swipe setDelaysTouchesBegan:NO];
            [[self tableView ]addGestureRecognizer:swipe];
            swipe.cancelsTouchesInView= YES;
            [swipe setNumberOfTouchesRequired:2];
            swipe.delegate = self;
            self.tableView.multipleTouchEnabled = YES;

但是当我在屏幕上用两根手指滑动时,会触发平移手势。 我该如何解决这个问题?

【问题讨论】:

这可能是因为您没有为UIPanGestureRecognizer 设置maximumNumberOfTouches 属性。设置recognizer.maximumNumberOfTouches = 1; 【参考方案1】:

正如 sooper 所说,设置 maximumNumberOfTouches = 1 可能会起作用。

对于尝试同时处理 2 个手势识别器的其他人,这两个手势都是 1 个触摸手势,我发现确保将此委托设置为是

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
    return YES;

然后在手势识别器操作中,您可以检查某个翻译或您需要的任何内容并取消其中一个手势识别器。

如:

- (void)panSwipeRecognizer:(UIPanGestureRecognizer*)panRecognizer

    CGPoint translation = [panRecognizer translationInView:self.superview];

    if(panRecognizer.state == UIGestureRecognizerStateBegan)
    
        if(fabsf(translation.x) < fabsf(translation.y))
        
            //deactivate horizontal gesture recognizer
            panRecognizer.enabled = NO;
            panRecognizer.enabled = YES;
        
        else //if(fabsf(translation.x) > fabsf(translation.y))
        
            //deactivate vertical gesture recognizer
            otherGestureRecognizer.enabled = NO;
            otherGestureRecognizer.enabled = YES;
        
    
    //other statements like stateChanged and stateBegan

【讨论】:

以上是关于UITableViewcell 和 UITableVIew 上的手势识别器的主要内容,如果未能解决你的问题,请参考以下文章

将子视图添加到 UITable

如何将文本包装在 Iphone 的 UITable 单元格中?

将 IBOutlets 连接到 UITableViewCell 原型

以编程方式在 UITableViewCell 下添加 UITextView 和 UIImageView Swift 4

在 cellForRowAtIndexPath 中返回不同的 UITableViewCell 类型

如何禁用自定义静态 UITableViewCell 的可访问性