получить направление вращения UIView на touchSMoved - PullRequest
4 голосов
/ 19 марта 2010

это может звучать смешно, но я часами пытался воссоздать ручку с реалистичным вращением, используя UIView и некоторые триггеры. Я достиг цели, но теперь я не могу понять, как узнать, вращается ли ручка влево или вправо. Самая важная часть математики здесь:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint pt = [touch locationInView:self];

    float dx = pt.x  - iv.center.x;
    float dy = pt.y  - iv.center.y;
    float ang = atan2(dy,dx);

    //do the rotation
    if (deltaAngle == 0.0) {
        deltaAngle = ang;
        initialTransform = iv.transform;
    }else
    {
        float angleDif = deltaAngle - ang;
        CGAffineTransform newTrans = CGAffineTransformRotate(initialTransform, -angleDif);
        iv.transform = newTrans;
        currentValue = [self goodDegrees:radiansToDegrees(angleDif)];
    }
}

в идеале, я мог бы использовать числовое значение, чтобы сказать мне, является ли вращение положительным или отрицательным.

Ответы [ 2 ]

2 голосов
/ 21 марта 2010

, если центральная точка вашей ручки является центром изображения, которое вы используете для своей ручки, тогда вы сможете определить, начинается ли касание слева / справа от центра и перемещается вверх / вниз. Если касание начинается слева и движется вниз, оно поворачивается влево. наоборот для касаний, которые начинаются на другой стороне от центра. Вы можете определить, перемещаются ли касания вверх или вниз, поместив в массив последовательные координаты x в методе touchesDidMove и выполнив простое сравнение.

0 голосов
/ 21 марта 2010

Спасибо Remover. Это близко к тому, что мне было нужно, но в конце концов, поскольку объект-ручка передает событие в класс контроллера, мне нужен был способ измерить значение из поворота ... т.е. В любом случае, я решил эту проблему, используя метод, описанный выше, и передал currentValue делегату. Затем делегат примет этот метод и с его собственным приватным плавающим сравнением, если значение больше или меньше последнего полученного значения:

// делегат использует частное значение для измерения от последнего обратного вызова #pragma mark UIKnobViewDelegate - (void) dialValue: (float) значение { if (lastValue == 0,00) { lastValue = lastValue; } если (значение

оттуда наш контроллер может делать все, что ему нравится

...