CALayer трансформирующийся - PullRequest
0 голосов
/ 01 февраля 2012

Мне нужно повернуть квадрат, когда пользователь делает UIRotationGesture.

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

Т.е. если поворот квадрата составляет 90 градусов, а пользователь продолжает вращаться до 100. квадрат вернется к 0 градусам и оживит до 100.

По сути, я хочу, чтобы квадрат отражал пользователя, когда он выполняет жест поворота.

- (void)respondToGesture:(UIRotationGestureRecognizer *)rec{

NSLog(@"Rotation: %f", rec.rotation);

[self rotateWithRadian:rec.rotation];

if (rec.state == UIGestureRecognizerStateEnded) {
    NSLog(@"gesture ended");
}

}



- (void)rotateWithRadian:(float)radian{

CABasicAnimation *spin = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];

spin.removedOnCompletion = NO;

spin.fillMode = kCAFillModeForwards;

[spin setByValue:[NSNumber numberWithFloat:radian]];

[spin setDuration:1.0];

[squarelayer addAnimation:spin forKey:@"spinAnimation"];

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012

Есть ли причина, по которой вы не устанавливаете преобразование слоя напрямую, а не используете анимацию?

Это должно делать то, что вы хотите:

- (void)respondToGesture:(UIRotationGestureRecognizer *)rec {
    if (rec.state == UIGestureRecognizerStateChanged) {
        CGAffineTransform currentTransform = squareLayer.affineTransform;
        squareLayer.affineTransform = CGAffineTransformRotate(currentTransform, gesture.rotation);
        gesture.rotation = 0;
    }
}

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

1 голос
/ 01 февраля 2012

Существует открытый исходный код (https://github.com/kirbyt/KTOneFingerRotationGestureRecognizer) для вращения одного пальца.Вы можете проверить это, будет намного лучше.Даже если вам нужен только обычный жест поворота, вы можете заглянуть в код для лучшего кода поворота.Он использует центр как источник.

...