使用 UIPanGestureRecognizer 通过 UIView 发送触摸

Posted

技术标签:

【中文标题】使用 UIPanGestureRecognizer 通过 UIView 发送触摸【英文标题】:Send touches through UIView with UIPanGestureRecognizer 【发布时间】:2018-12-12 13:24:40 【问题描述】:

基本上,我想在表格视图上方的 UIView 中检测向上/向下平移手势,同时正常滚动表格视图。

我尝试过实现pointInside 和gestureRecognizer:shouldReceiveTouch:,但它们在使用时都会绕过手势识别器。

有没有办法将相同的触摸发送到两个视图或在处理后发送触摸?还是一种在不拦截手势的情况下跟踪手势的通用方法?

【问题讨论】:

我的第一个问题是why?。您可以尝试覆盖不正确的本机功能。 UITableView 提供了一些协议来检测 tableview 滚动。 你可能想看看 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 我不是要覆盖原生函数,而是要添加更多。我在想 tbv 上方的 UIView 来跟踪触摸而不干扰 tbv。 @Wasserfloh 感谢您的提示,感觉它可能会起作用。 需要 tableview上面的UIView吗? 【参考方案1】:

将您自己的 UIPanGestureRecognizer 添加到您的 Tableview。

通过返回 YES 让他们一起生活 -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

//setup
                        UITableView* tableview=[[UITableView alloc] initWithFrame:CGRectMake(0, 0, 400, 500)];
                        tableview.dataSource=self;
                        [self.view addSubview:tableview];

                        UIPanGestureRecognizer* pangr=[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(someMethod:)];
                        pangr.delegate=self;
                        [tableview addGestureRecognizer:pangr];

            .
            .
            .

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

                    return YES;
                

 -(void)someMethod:(UIPanGestureRecognizer*)sender
            CGFloat velocityX = ([sender velocityInView:self.view].x);
            CGFloat velocityY = ([sender velocityInView:self.view].y);
            NSLog(@"pannig %f %f", velocityX, velocityY);
        

在我的测试中运行良好。 如果你真的需要 tableview 上方的 UIView,你可以把它放在那里并设置userInteractionEnabled=NO

【讨论】:

【参考方案2】:

由于 UITableView 是 UIScrollView 的继承者,它对自身的内部手势做出反应。我认为在这种情况下无法实现向上/向下手势。

【讨论】:

以上是关于使用 UIPanGestureRecognizer 通过 UIView 发送触摸的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 UIPanGestureRecognizer 移动对象时会有延迟?

UIPanGestureRecognizer ***视图未获取事件,子视图使用它们

在 UITableView 上滑动删除以使用 UIPanGestureRecognizer

在 UIPanGestureRecognizer 中使用velocityInView

使用 UIPanGestureRecognizer 拖动 + 旋转触摸下车

使用 UIPanGestureRecognizer 移动和缩放 UIView