Анимация не показывает - PullRequest
3 голосов
/ 18 июля 2011

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

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
[animation setDelegate:self];

NSRect pos = [imageView frame];
[animation setFromValue:[NSValue valueWithRect:pos]];
NSPoint point = NSMakePoint(pos.origin.x-40, pos.origin.y);

[animation setToValue:[NSValue valueWithPoint:point]];
[animation setDuration:2.0];

[[imageView animator] addAnimation:animation forKey:@"myTest"];

пока это рабочий код:

NSRect position = [imageView frame];
position.origin.x -= 40;
[[imageView animator] setFrame:position];

Но autoReverse не работает.

Что-то не так с первым? И как заставить работать обратное движение во 2-м? Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 июля 2011

(Примечание: я не очень разбираюсь в Какао, так как я в основном разработчик для iOS; я не тестировал ни один из следующих материалов)

Я думаю, что проблемаВы пытаетесь смешать CoreAnimation и Animator Proxy.Вы не добавляете анимацию к Animator, а к слою:

[[imageView layer] addAnimation:animation forKey:@"myTest"];

Другая возможность может состоять в том, чтобы использовать NSViewAnimation и связывать их вместе.См. Руководство по программированию анимации для какао , стр. 13. Таким образом, у вас будет одна анимация, чтобы двигаться в одном направлении, и когда она закончится, она запускает вторую, которая возвращается назад.Кажется, это работает так:

NSMutableDictionary *firstDict = [NSMutableDictionary dictionary];
[firstDict setObject:imageView forKey:NSViewAnimationTargetKey];
[firstDict setObject:[NSValue valueWithRect:originalFrame] forKey:NSViewAnimationStartFrameKey];
[firstDict setObject:[NSValue valueWithRect:targetFrame] forKey:NSViewAnimationEndFrameKey];

NSMutableDictionary *secondDict = [NSMutableDictionary dictionary];
[secondDict setObject:imageView forKey:NSViewAnimationTargetKey];
[secondDict setObject:[NSValue valueWithRect:targetFrame] forKey:NSViewAnimationStartFrameKey];
[secondDict setObject:[NSValue valueWithRect:originalFrame] forKey:NSViewAnimationEndFrameKey];

NSViewAnimation *firstAnimation = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObject:firstDict]];
[firstAnimation setDuration:2.0];

NSViewAnimation *secondAnimation = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObject:secondDict]];
[secondAnimation setDuration:2.0];

[secondAnimation startWhenAnimation:firstAnimation reachesProgress:1.0];
[firstAnimation startAnimation];

Затем в Lion (OS X 10.7) вы можете установить обработчик завершения при использовании Animator Proxy .Это должно работать так:

[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:2.0];
[[NSAnimationContext currentContext] setCompletionHandler:^(void) {
    // Here comes your code for the reverse animation.
    [NSAnimationContext beginGrouping];
    [[NSAnimationContext currentContext] setDuration:2.0];
    [[aView animator] setFrameOrigin:originalPosition];
    [NSAnimationContext endGrouping];
}];
[[aView animator] setFrameOrigin:position];
[NSAnimationContext endGrouping];
0 голосов
/ 27 июля 2011

Не знаю точно, но для первой позиции - это CGPoint, так что вы можете попробовать использовать этот тип для ваших fromValue и toValue.В настоящее время вы используете NSRect и NSPoint (последний из которых должен работать, но не уверен насчет первого).

Для второго, как вы определяете автореверс?+ setAnimationRepeatAutoreverses должен вызываться из блока анимации (после «beginAnimations»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...