Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 由多个视图处理的触摸事件_Ios_Touch_Touchesmoved_Touch Event_Uievent - Fatal编程技术网

Ios 由多个视图处理的触摸事件

Ios 由多个视图处理的触摸事件,ios,touch,touchesmoved,touch-event,uievent,Ios,Touch,Touchesmoved,Touch Event,Uievent,我在UITableView上有一个子类UIView。我正在使用UITableView显示一些数据,同时,我想覆盖一个跟随手指的动画(例如,留下痕迹) 如果正确,我需要通过UIView子类和UITableView处理触摸事件。我该怎么做? 是否可以在UIView子类上触发触摸移动,然后在UITableView上触发 非常感谢您的帮助。UITableView将未处理的触摸事件转发给UIView。(谷歌“响应链”) 因此,您只能在UIView中处理触摸事件。所以在你看来 touchesstart-执

我在
UITableView
上有一个子类
UIView
。我正在使用
UITableView
显示一些数据,同时,我想覆盖一个跟随手指的动画(例如,留下痕迹)

如果正确,我需要通过
UIView
子类和
UITableView
处理触摸事件。我该怎么做? 是否可以在UIView子类上触发
触摸移动
,然后在
UITableView上触发


非常感谢您的帮助。

UITableView将未处理的触摸事件转发给UIView。(谷歌“响应链”)

因此,您只能在UIView中处理触摸事件。所以在你看来

  • touchesstart-执行初始化操作

  • 触摸移动-在UIView上绘制尾部(使用计时器/延迟响应来消除可消除的点,使其看起来像一条轨迹)

  • touchesend-做剩余的事情


  • 希望这有帮助。

    不,你不能含蓄地这样做。章说

    窗口对象使用命中测试和响应器链来查找 查看以接收触摸事件。在命中测试中,窗口调用 hitTest:withEvent:位于视图层次结构的最顶部视图上;这 方法通过递归调用每个 返回“是”的视图层次结构中的视图,沿 层次结构,直到找到在其边界内进行触摸的子视图 发生了。该视图将成为命中测试视图

    所以,当窗口找到被触摸的视图时,它返回YES。当前只有一个视图可以处理触摸


    但如果您需要为UITableView处理事件,请为UIView处理它!您可以使用、函数将接触点转换为所需的坐标,将子视图添加到UITableView,并根据坐标移动它,以及其他许多事情。

    我解决此问题的方法不是很干净,但它是有效的。如果有更好的方法,请告诉我

    我已经为我的自定义
    ui视图
    覆盖了
    hitTest
    ,以便它将触摸指向下面的
    ui表视图
    。然后在
    UITableView
    中,我通过
    touchsbegind
    touchsmoved
    等方式处理手势。在
    UIView
    中,我还调用了
    touchsbegind

    这样,触摸由两个视图处理。 我之所以没有采取相反的做法(让
    UIView
    touchesbeated
    调用
    UITableView
    touchesbeated
    )是因为
    UITableView
    上的手势识别器无法工作

    UIView
    subclass'
    hitTest

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
        // tview is the UITableView subclass instance
        CGPoint tViewHit = [tView convertPoint:point fromView:self];        
        if ([tView pointInside:tViewHit withEvent:event]) return tView;
    
        return [super hitTest:point withEvent:event];
    }
    
    UITableView
    子类的
    touchsbegind

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        UITouch *touch = [touches anyObject];
        CGPoint location = [touch locationInView:touch.view];
        // ....
    
        // view is the UIView's subclass instance
        [view touchesBegan:touches withEvent:event];
    }
    

    谢谢你的回复,但我不确定我是否完全理解(尤其是我不理解第一句话的意思)。我知道我可以在UIView中绘制轨迹,但我仍然需要将触摸事件“传递”到UITableView(滚动、选择等)。对不起,如果我误解了。在Objective-C中,有一个叫做响应者链的东西。如果类不处理特定事件,则需要由其超类处理这些事件。如果没有类处理该事件,则该事件最终由NSObject处理。因此,在您的情况下,由于UIView是UITableView的超类,您可以从UIView响应UITableView事件。如果我不是Objective-C的专家,我很抱歉。。。你能举个例子说明这一点如何适用于May案吗?我是否应该拥有手势的UITableView句柄,然后将它们传递给超类?如何处理?根本不在UITableView中处理事件,只在UIView中处理事件。您认为我刚才发布的答案如何?这肯定会起作用。我可能在UIView子类下有多个元素。。。我是否需要对所有这些元素重复该过程?还有,我需要转换坐标来获得全局坐标吗?谢谢。我已经按照你的建议做了,但是我不能再滚动UITableView了。你知道为什么吗?谢谢你,太酷了。过了一会儿我想做类似的事情。谢谢你的发帖。我真的很喜欢这个。我在子视图上手动调用touchesbreated等,试图以错误的方式进行操作。这个方法非常有效!