Как оживить маятник часов, где маятник начинается в положении «6 часов»? - PullRequest
0 голосов
/ 04 августа 2011

Я пытаюсь оживить движение маятника, который начинается в положении «6 часов», затем поворачивается несколько раз, а затем снова останавливается в положении «6 часов».

Я уже знаю, как изменить опорную точку слоя и как ее повернуть.

У меня есть метод, чтобы вращать слой.

- (void)spinLayer:(CALayer *)inLayer duration:(CFTimeInterval)inDuration direction:(int)direction forPartsOfPi:(float) degrees withReverse:(bool) reverse andRepeatCount:(float) repeatCount;

Я подумал, что было бы лучше разделить движение маятника на 3 "колебания". Первый поворот - из стартовой позиции, скажем, в 9 часов. Поэтому я впервые вызываю Метод.

[self spinLayer:layer duration:0.4 direction:SPIN_CLOCK_WISE forPartsOfPi:M_PI/2 withReverse:NO andRepeatCount:0];

Затем, в animationDidFinish Delegate, я вызываю метод еще раз, чтобы позволить ему сделать несколько колебаний. Поскольку вращение Маятника теперь вдвое больше длины первого свинга, я звоню:

[self spinLayer:layer duration:0.8 direction:SPIN_COUNTERCLOCK_WISE forPartsOfPi:M_PI withReverse:YES andRepeatCount:4];

после этого я хочу, чтобы маятник вернулся в положение 6 часов, поэтому я звоню:

[self spinLayer:layer duration:0.4 direction:SPIN_COUNTERCLOCK_WISE forPartsOfPi:M_PI/2 withReverse:NO andRepeatCount:0];

Вот реализация моего Метода:

- (void)spinLayer:(CALayer *)inLayer duration:(CFTimeInterval)inDuration direction:(int)direction forPartsOfPi:(float) degrees withReverse:(bool) reverse andRepeatCount:(float) repeatCount
{


   CABasicAnimation* rotationAnimation;

    // Rotate about the z axis
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];

    // Rotate 180 degress, in direction specified
    rotationAnimation.toValue = [NSNumber numberWithFloat: degrees * direction];

    // Perform the rotation over this many seconds
    rotationAnimation.duration = inDuration;

    rotationAnimation.autoreverses = reverse;

    rotationAnimation.fillMode = kCAFillModeForwards;

    rotationAnimation.removedOnCompletion = FALSE;
    rotationAnimation.repeatCount = repeatCount;
    rotationAnimation.delegate  = self;

    // Set the pacing of the animation
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

    // Add animation to the layer and make it so
    [inLayer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
}

Таким образом, проблема в том, что второе колебание начинается не в конце первого, а в положении «6 часов».

Кто-нибудь может объяснить мне, как это сделать?

Спасибо заранее

Мав

1 Ответ

1 голос
/ 04 августа 2011

Анимация начинается со значения свойства model layer .Анимация влияет только на презентационный слой .Поэтому после завершения первой анимации слой модели по-прежнему указывает на ориентацию в 6 часов.

Что вы должны сделать, это в вашем методе spinLayer установить преобразование слоя в окончательное преобразование ориентации:1008 *

layer.transform = CATransform3DMakeRotation(radians, 0, 0, 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...