Кажется, что конкретный случай может быть довольно простым для реализации. Разделите область ввода на четыре квадранта и отследите положение в каждом квадранте. Последовательность квандрантов определяет, завершили ли они или путешествовали по кругу.
Псевдокод для описания идеи:
static touchKeeper; //touch, quadrant
static touchIndex=0;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[allTouches allObjects] objectAtIndex:0];
touchKeeper[touchIndex].touch = touch;
touchKepper[touchIndex].quadrant = DetectQuadrant(touch));
if (touchIndex > 3 && (touchKeeper[3].quadrant == touchKeeper[2].quadrant+1 == touchKeeper[1].quadrant+2 == touchKeeper[0].quadrant+3)) {
[self doCircleAction];
touchIndex=0;
}
else touchIndex++;
}
Идея состоит в том, что вам нужно только приблизительно определить конкретное прикосновение к региону. Таким образом, процедура квадранта будет выглядеть примерно так:
int DetectQuadrant(UITouch *touch) {
CGPoint point;
point = [touch locationInView:self];
if (endPoint.x > X1 && endPoint.x < X2 && endPoint.Y > Y1 && endPoint.Y < Y2)
return QUAD1;
} else etc
Я использую квадранты в качестве примера - ясно, что вы могли бы нарисовать квадрат и подумать «круг!». Точность повышается за счет увеличения числа областей в методе обнаружения. Основная идея состоит в том, чтобы мыслить в терминах последовательностей областей, чтобы достичь желаемого поведения без чрезмерных усложнений (таких как обнаружение кривой Безье или подобная ерунда). Этот псевдокод, безусловно, грубоват, и я уверен, что есть хороший способ отточить реализацию. Я думал о «обнаружении кругового движения» для проекта, над которым я работаю, и это была грубая идея, с которой я пришел.
Наслаждайтесь!