Что-то не столь очевидное или, по крайней мере, для меня, это то, что при выполнении setFrame:
происходит две анимации с клавишами frameSize
и frameOrigin
.
.
В зависимости от того, какие у вас исходные и конечные кадры, вам может потребоваться зарегистрироваться в качестве делегата для одного или обоих из них.
Я бы также порекомендовал вам сделать копию анимации, которую вы получили из -animationForKey:
, и сохранить вашу измененную копию в словаре animations
вашего объекта. Таким образом, ваш делегат будет вызываться только по окончании продолжительности анимации этого конкретного объекта, по сравнению со всеми объектами, оживляющими этот ключ.
например.
CAAnimation *animation = [[view animationForKey:@"frameOrigin"] copy];
animation.delegate = self;
[view setAnimations:[NSDictionary dictionaryWithObject:animation forKey:@"frameOrigin"]];
Таким образом, ваш объект анимации заменит объект анимации по умолчанию для этого представления. Затем реализуйте те методы делегирования, которые вас интересуют.