CABasicAnimation не имеет никакого эффекта - PullRequest
5 голосов
/ 29 октября 2011

У меня очень простая проблема, и я убираю волосы. Я пытаюсь оживить движение NSButton. Теперь я знаю о почти слишком простом:

[[button animator] setFrame:newCGRect];

Однако я бы хотел увеличить время, необходимое для перемещения кнопки. Итак, я посмотрел на немного более сложную CABasicAnimation. Я думаю Я все делаю правильно, но NSButton вообще не двигается.

CGPoint center = CGPointMake(10, 20);

CALayer *layer = button.layer;

layer.position = CGPointMake(button.frame.size.width / 2, button.frame.size.height / 2);

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
animation.fromValue = [layer valueForKey:@"position"];
[animation setToValue:[NSValue valueWithPoint:center]];
[animation setFillMode:kCAFillModeForwards];
[animation setRemovedOnCompletion:NO];
[animation setDuration:3.0];

[layer addAnimation:animation forKey:@"position"];

Здесь кнопка - кнопка NS. Я устанавливаю положение слоя в центр кнопки, потому что я думаю , что "положение" должно относиться к центру. Затем все, что я делаю, это перемещаю (предположительно) кнопку в центр, в анимации, которая длится 3 секунды. Я добавляю анимацию к слою, и тогда ничего не происходит.

Теперь, кто-нибудь знает, что я делаю не так? Или, на заметку, есть ли возможность использовать свойство аниматора и установить длину анимации?

Ответы [ 2 ]

4 голосов
/ 29 октября 2011

Оберните неявную анимацию в транзакции, чтобы настроить анимацию.

[CATransaction begin];
[CATransaction setAnimationDuration:3];
[[button animator] setFrame:newframe];
[CATransaction commit];
2 голосов
/ 30 октября 2011

Оказывается, мой исходный код был излишним, и ответ Джейсона Харвига ниже был более точным. Единственная проблема заключалась в том, что он не анимировал с заданной длительностью при анимации подкласса NSView (в данном случае NSButton). Чтобы исправить это, вот следующий код, который анимирует с заданной продолжительностью:

[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:8];
[[button animator] setFrame:newRect];  
[NSAnimationContext endGrouping];
...