【问题标题】:Multitouch with UIPanGestureRecognizer使用 UIPanGestureRecognizer 进行多点触控
【发布时间】:2012-05-15 00:16:40
【问题描述】:

我正在尝试为我的视图实现 UIPanGestureRecognizer。如何添加多点触控?下面是我认为的代码(UIView 的子类)。我希望能够同时知道所有触摸的位置和速度。当前代码仅打印出一次触摸的位置和速度。更改属性 minimumNumberOfTouches 和 maximumNumberOfTouches 不起作用。非常感谢您的帮助。

UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
panGestureRecognizer.cancelsTouchesInView = NO;
[self addGestureRecognizer:panGestureRecognizer];


- (void)handlePanGesture:(UIPanGestureRecognizer *)panGestureRecognizer
{
    CGPoint location = [panGestureRecognizer locationInView:panGestureRecognizer.view];
    CGPoint velocity = [panGestureRecognizer velocityInView:panGestureRecognizer.view];

    NSLog(@"Location: %@",  NSStringFromCGPoint(location));
    NSLog(@"Velocity: %@",  NSStringFromCGPoint(velocity));

}

【问题讨论】:

    标签: iphone ios ipad touch multi-touch


    【解决方案1】:

    来自UIGestureRecogniser 的苹果文档

    (CGPoint)locationOfTouch:(NSUInteger)touchIndex inView:(UIView *)view 参数 触摸索引 UITouch 对象在接收方维护的私有数组中的索引。这个触摸对象代表当前手势的触摸。 看法 发生手势的 UIView 对象。指定 nil 表示窗口。 返回值 局部坐标系统中的一个点,用于标识触摸的位置。如果为视图指定 nil,则该方法返回窗口基本坐标系中的触摸位置。

    (NSUInteger)numberOfTouches 返回值 接收方维护的私有数组中 UITouch 对象的数量。这些对象中的每一个都代表当前手势中的一次触摸。

    讨论 在循环中使用此方法返回的值,您可以使用 locationOfTouch:inView: 方法询问各个触摸的位置。

    例如:

    (目标-C)

        for(int i=0; i<[panGestureRecogniser numberOfTouches]; i++)
        {
             CGPoint pt = [panGestureRecogniser locationOfTouch:i inView:self];
        }
    

    (斯威夫特)

        for i in 0..<panGestureRecogniser.numberOfTouches {
             let pt = recognizer.location(ofTouch: i, in: panGestureRecognizer.view)
        }
    

    至于速度,我相信它只有一个值,如果不编写一个自定义方法来计算一系列调用中每次触摸之间的差异,就无法获得每次触摸的速度。但是,不能保证每次触摸都在同一个索引处。

    注意:至于最小和最大触摸次数,需要相应设置以获得多次触摸。

    【讨论】:

    • 非常感谢您的帮助。使用 for 循环,所有触摸的位置都被正确打印出来。我尝试在循环中添加速度代码并为所有触摸获得相同的速度。您建议编写自定义方法。你能给我一些关于方法的更多指导吗?谢谢!
    • 您必须自己实现它,但我认为您可以将所有 pts 存储在一个名为 lastPts 的数组中,以及将它们存储在另一个变量中的时间。然后,当您收到下一个 handlePan 呼叫时,您可以计算每个人从最后一次呼叫到这次呼叫所花费的时间的距离。但不能保证触摸会以相同的顺序出现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多