iPhone4 iOS5 UIRotationGestureRecognizer, как запомнить смещение вращения для последующих вращений? - PullRequest
1 голос
/ 28 ноября 2011

Я пытаюсь создать похожее на ручку поведение в одном из моих представлений с помощью UIRotationGestureRecognizer.Это работает и позиционирует вид, как и ожидалось.Однако каждый раз, когда выполняется жест, вращение распознавателя сбрасывается, поэтому ручка каждый раз начинается с 0.

Как я могу вспомнить последнее вращение UIRotationGestureRecognizer, чтобы позволить пользователю регулировать ручку UIView, не сбрасывая ее каждый раз?

Я пытаюсьчтобы распознаватель начал вычислять изменения поворота с последнего известного поворота представления:

knob starts at 0, recognizer is at 0
recognizer is rotated to 45 degrees
recognizer stops rotating
the knob is left at 45 degrees //this is already happening with the provided code snippet

следующее касание:

//this is what's is happening
recognizer starts at 0, rotates the knob back to 0
//I want it to be:
recognizer starts at 45, rotates the knob as in the example above. 


- (IBAction)rotateView:(id)sender {

    if([sender isKindOfClass:[UIRotationGestureRecognizer class]])
    {
            UIRotationGestureRecognizer* recognizer = sender;

            CGAffineTransform transform = CGAffineTransformMakeRotation([recognizer rotation]);
            rotatingView.transform = transform;
    }

}

Ответы [ 3 ]

3 голосов
/ 28 ноября 2011

Вы должны иметь возможность получить текущее вращение вращающегося вида из его свойства transform.Сохраните это значение в переменной savedRotation, когда начнется жест.Обязательно назначьте delegate для обработки обратного вызова gestRecognizerShouldBegin .

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)recognizer
{
    savedRotation = atan2(rotatingView.transform.b, rotatingView.transform.a);
    return YES;
}

- (void)rotateView:(UIRotationGestureRecognizer*)recognizer
{
    rotatingView.transform = CGAffineTransformMakeRotation(recognizer.rotation+savedRotation);
}
1 голос
/ 06 октября 2012

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

rotatingView.transform = CGAffineTransformScale(rotatingView.transform, recognizer.scale, recognizer.scale);
[recognizer setRotation:0];   // this line

Вы также должны делать это для любых преобразований перевода или масштабирования, которые вы можете выполнять при обработке жестов. Есть следующие методы:

[recognizer setScale:1];
[recognizer setTranslation:CGPointZero inView:recognizer.view.superview];
1 голос
/ 28 ноября 2011

Преобразование преобразования:

rotatingView.transform = CGAffineTransformRotate(rotatingView.transform, [recognizer rotation]);
...