Продолжайте вращать изображение после окончания жеста вращения - PullRequest
0 голосов
/ 11 марта 2012

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

Оно вращается после того, как я отпустил пальцы, но когда оно останавливаетне остается под повернутым углом.Устанавливает угол поворота на последний угол после отпускания пальца.

- (void)rotateCoaster:(UIRotationGestureRecognizer *)recognizer {

    if(recognizer.numberOfTouches >= 2) {
        twoTouchesDetected = YES;
    }
    else {
        twoTouchesDetected = NO;
    }


    if(recognizer.state == UIGestureRecognizerStateBegan || 
       recognizer.state == UIGestureRecognizerStateChanged)
    {
        recognizer.view.transform = CGAffineTransformRotate(recognizer.view.transform, 
                                                            recognizer.rotation);
        _player.rotationVelocity = recognizer.velocity;
        _player.rotation = recognizer.rotation;

        [recognizer setRotation:0];
    }

    if( !twoTouchesDetected ) {
        [self rotationCalculations:nil];
        rotating = YES;
    }

    if( recognizer.state == UIGestureRecognizerStateEnded || 
       recognizer.state == UIGestureRecognizerStateCancelled ) {
        [self dropDownCoaster];
    }
    _player.rotationVelocity = recognizer.velocity; 
}

- (void)rotationCalculations:(NSTimer *) dt {
//    dTime += dt.timeInterval;

    [CATransaction begin];
    [CATransaction setValue:[NSNumber numberWithFloat:2.0] forKey:kCATransactionAnimationDuration];

    CABasicAnimation *animation;
    animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
//    animation.fromValue = [NSNumber numberWithFloat:0.0];
//    animation.toValue = [NSNumber numberWithFloat:_player.rotationVelocity * M_PI];
    animation.fromValue = nil;
    animation.toValue = nil;
    animation.byValue = [NSNumber numberWithFloat:_player.rotationVelocity * M_PI];
    animation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseOut];
    animation.delegate = self;
    [_coasterImageView.layer addAnimation:animation forKey:@"rotationAnimation"];

    [CATransaction commit];

}

1 Ответ

1 голос
/ 16 марта 2012

Я полагаю, что ваша проблема здесь в том, что, как говорит WWDC 2011 Сессия 421 - Базовые основы анимации @ ~ 26: 00 , «явные анимации не влияют на значения модели иерархии вашего слоя».

В основном, помимо использования Core Animation для анимации вращения, вам также необходимо изменить свойство объекта модели (UIView или CALayer).Таким образом, когда анимация заканчивается и представление снова отображается нормально, оно находится в правильном положении и в правильном повороте.

Вероятно, что-то вроде:

_coasterImageView.view.transform = CGAffineTransform... //rotation with toValue 

Если вы собираетесь делатьмного работы с Core Animation, я настоятельно рекомендую вам посмотреть видео.

...