gpt4 book ai didi

ios - 旋钮旋转手势识别器

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:02:49 26 4
gpt4 key购买 nike

我正在尝试创建一个能够检测 4 个手指旋转的手势识别器(类似于旋转音量旋钮)。
主要思想是创建 UIRotateGestureRecognizer 的子类并覆盖其方法。在 -touchesBegan 中,我检测触摸次数,如果该次数低于 4,则手势状态为失败。
之后,我将位置点传递给一个算法,该算法可以找到凸包的直径。如果你考虑一下,你的手指就是顶点,我只需要找到距离最大的两个顶点。获得这两点后,我将它们引用为 ivar,并将它们传递给父类(super class),因为它是一个仅用两根手指的简单旋转。
它不起作用:

  1. 触摸检测似乎很难
  2. -touchesHasMoved 很少被调用
  3. 当它被调用时,它挂起的时间最多

有人可以帮助我吗?

代码如下:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if (touches.count<4) {
//FAIL
self.state = UIGestureRecognizerStateFailed;
return;
}

//Find the diameter of the convex hull
NSArray * touchesArray = [touches allObjects];
NSMutableArray * pointsArray = @[].mutableCopy;
for (UITouch * touch in touchesArray) {
[pointsArray addObject:[NSValue valueWithCGPoint:[touch locationInView:touch.view]]];
}
DiameterType convexHullDiameter = getDiameterFromPoints(pointsArray);
CGPoint firstPoint = convexHullDiameter.firstPoint;
CGPoint secondPoint = convexHullDiameter.secondPoint;
for (UITouch * touch in touchesArray) {
if (CGPointEqualToPoint([touch locationInView:touch.view], firstPoint) ) {
self.fistTouch = touch;
}
else if (CGPointEqualToPoint([touch locationInView:touch.view], secondPoint)){
self.secondTouch = touch;
}
}
//Calculating the rotation center as a mid point between the diameter vertices
CGPoint rotationCenter = (CGPoint) {
.x = (convexHullDiameter.firstPoint.x + convexHullDiameter.secondPoint.x)/2,
.y = (convexHullDiameter.firstPoint.y + convexHullDiameter.secondPoint.y)/2
};
self.rotationCenter = rotationCenter;
//Passing touches to super as a fake rotation gesture
NSSet * touchesSet = [[NSSet alloc] initWithObjects:self.fistTouch, self.secondTouch, nil];
[super touchesBegan:touchesSet withEvent:event];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
if (touches.count<4) {
self.state = UIGestureRecognizerStateFailed;
return;
}

[super touchesMoved:[[NSSet alloc] initWithObjects:self.fistTouch, self.secondTouch, nil] withEvent:event];
}

- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesCancelled:[[NSSet alloc] initWithObjects:self.fistTouch, self.secondTouch, nil] withEvent:event];
}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesEnded:[[NSSet alloc] initWithObjects:self.fistTouch, self.secondTouch, nil] withEvent:event];
}

最佳答案

初始检测困难的原因是所有触摸可能不会同时开始。当单独的触摸落在屏幕上时,touchesBegan 可能会被多次调用。您可以使用事件参数通过 event.allTouches 查询所有当前触摸。因此,您当前触发手势失败的方法将行不通。如果 touches.count < 4,则不应将状态设置为失败,而应在 event.allTouches.count < 4 时返回。如果第四次触摸未在特定时间内发生,则可以使用计时器将状态设置为失败首先。

touchesMoved 可能有问题,因为事件对象中的触摸与您传递给 super 的集合中的触摸不匹配。

关于ios - 旋钮旋转手势识别器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19662900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com