плавная маятниковая анимация с Core Animation Framework

я пытаюсь сделать анимацию с uiimageview. в этом представлении изображение со стрелкой, которую я хочу очень плавно повернуть примерно на 45 градусов назад и вперед, как маятник или старые часы. что-то вроде этого, просто гладкое и с моим изображением: http://bit.ly/cArvNw (нашел это с Google ;) )

моя текущая установка выглядит так:

    UIImageView* rotatingImage = [[UIImageView alloc] initWithFrame:CGRectMake(10.0, 10.0, 200.0, 200.0)];
    [rotatingImage setImage:[UIImage imageNamed:@"wind.png"]];

    CALayer *layer = rotatingImage.layer;
    CAKeyframeAnimation *animation;
    animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];
    animation.duration = 0.5f;
    animation.cumulative = YES;
    animation.repeatCount = 100;
    animation.values = [NSArray arrayWithObjects:           // i.e., Rotation values for the 3 keyframes, in RADIANS
                        [NSNumber numberWithFloat:[self degreesToRadians:45.0]], 
                        [NSNumber numberWithFloat:[self degreesToRadians:-45.0]], nil]; 
    animation.keyTimes = [NSArray arrayWithObjects:     // Relative timing values for the 3 keyframes
                          [NSNumber numberWithFloat:0], 
                          [NSNumber numberWithFloat:.5], nil]; 
    animation.timingFunctions = [NSArray arrayWithObjects:
                                 [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn],        // from keyframe 1 to keyframe 2
                                 [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut], nil]; // from keyframe 2 to keyframe 3
    animation.removedOnCompletion = NO;
    animation.fillMode = kCAFillModeForwards;

    [layer addAnimation:animation forKey:nil];

    [self addSubview:rotatingImage];

это действительно боль, добавьте 45 градусов, затем 45 градусов назад с «-45» не работает. Я новичок в основной анимации и не знаю, как настроить мой код, чтобы получить желаемую анимацию.

кто-нибудь может помочь, пожалуйста?


person choise    schedule 06.02.2010    source источник


Ответы (2)


Примечание. Этот метод не использует базовую анимацию, но он очень прост и, вероятно, использует меньше ресурсов.

Во-первых, сделайте UIImageView в два раза выше, тем самым сделав центр вращения равным центру изображения.

Затем определите их в @interface файла заголовка (например, вашего UIViewController):

BOOL goingCW; // going clockwise = YES, going counterclockwise = NO
CGFloat angle; // angle by which to change the image's rotation value

Затем поместите это в метод инициализации, который запускается один раз:

goingCW = YES; // change this to NO to make it start rotating CCW instead
angle = 0;

[NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(update) userInfo:nil repeats:YES];

Затем определите update, учитывая, что arrow является экземпляром UIImageView:

- (void)update {
    if (goingCW) {
        if (angle > M_PI / 4) goingCW = NO; // M_PI / 4 is equal to 45 degrees
        angle += M_PI / 60; // increase 60 to slow down the rotation, etc.
    } else {
        if (angle < -M_PI / 4) goingCW = YES; // -M_PI / 4 is equal to -45 degrees
        angle -= M_PI / 60; // increase 60 to slow down the rotation, etc.
    }

    // rotate the UIImageView appropriately
    arrow.transform = CGAffineTransformMakeRotation(angle);
}

Это также предполагает, что вы начинаете в положении лицом вниз.

person Arseniy Banayev    schedule 06.02.2010
comment
это нормально, но несколько вещей. с помощью этого метода я не могу сделать плавный переход в конце угла. Я слышал, что анимация с помощью NSTimes — это плохо, но я не знаю. ваш метод - лучший работающий банкомат. - person choise; 08.02.2010
comment
возможно, попробуйте изменить timeInterval с 0,05 (выполняется 20 раз в секунду) на 0,01 (выполняется 100 раз в секунду) или какой-либо другой интервал. дайте мне знать, как это происходит. - person Arseniy Banayev; 09.02.2010
comment
на самом деле я только что понял, что вы, возможно, имели в виду. предполагалось, что плавный переход в конце угла означает смоделированный эффект гравитационного типа, когда сила тянет стрелу вниз и уменьшает изменение угла на высоте вращения? если это так, вы можете изменить существующий код, сделав приращение угла (т. е. код -= и +=) функцией текущего смещения y определенной точки на изображении. может быть, сделать другую переменную, которая считает вверх, а затем вниз каждую итерацию -(void)update, так что, поскольку - person Arseniy Banayev; 09.02.2010
comment
[продолжение...] uiimageview не перемещается (т. е. вы не можете следить за другими постоянными позициями x или y), вы можете сделать приращение или уменьшение угла зависимым от этой дополнительной переменной. это решает вашу проблему? - person Arseniy Banayev; 09.02.2010

Вы видели пример приложения Apple для iPhone, "Метроном"?

Он делает почти то же самое, что вы пытаетесь сделать, используя Core Animation.

person 粪便猴子    schedule 07.02.2010
comment
спасибо, я изучал это, но этот пример полностью перегружен. я действительно не нахожу существенной части с простой анимацией. - person choise; 08.02.2010
comment
хахаха... это типично для Apple. Их документация и примеры — лучшее дерьмо, которое когда-либо производила одна компания. Даже M$ при всей их дряни не могут такие документы выдавать. Это похоже на то, как кто-то пытается объяснить операцию на головном мозге, используя твиттер со 140 символами или меньше ... эта функция делает это. Чтобы заставить это работать, используйте это ... Примеры кода хуже, чем документы. Они составляют код из 10 000 строк, чтобы объяснить, как вибрировать устройство, вместо того, чтобы создавать набор понятных фрагментов. Если бы не такие сайты, как SO и пара книг, нам бы конец. - person Duck; 12.04.2010