Я не уверен в создании блочного метода, но я обнаружил, что довольно простой способ реализовать пользовательскую функцию плавности и по-прежнему использовать блочную анимацию — это переопределить метод слоя addAnimation:(CAAnimation *)anim forKey:(NSString *)key
и заменить его другой функцией плавности. для любого вида, который вы хотите анимировать.
Для начала создайте подкласс CALayer и добавьте следующий метод...
// CustomViewLayer.m
#import "CustomViewLayer.h"
@implementation CustomViewLayer
- (void)addAnimation:(CAAnimation *)anim forKey:(NSString *)key
{
if ([anim isKindOfClass:[CABasicAnimation class]]) {
// intercept the animation and insert your own easing function
int x1 = 0.250;
int y1 = 1.185;
int x2 = 0.210;
int y2 = 1.000;
CAMediaTimingFunction *func = [CAMediaTimingFunction functionWithControlPoints:x1 :y1 :x2 :y2];
anim.timingFunction = func;
}
[super addAnimation:anim forKey:key];
}
@end
В своем подклассе представления убедитесь, что вы возвращаете пользовательский класс слоя...
// CustomView.m
#import "CustomView.h"
#import "CustomViewLayer.h"
@implementation CustomView
+ (Class)layerClass
{
return [CustomViewLayer class];
}
@end
Затем вы можете использовать стандартные методы анимации на основе блоков, такие как...
[UIView animateWithDuration:0.3 animations:^{
[customView setFrame:newFrame];
}];
...и будет использоваться пользовательская функция плавности. Это может не решить все ваши проблемы, но это легко сделать, и вы по-прежнему можете использовать блочную анимацию. Однако имейте в виду, что функция замедления будет применяться ко всем без исключения анимациям, которые анимируются с помощью блочных методов. Поэтому, если вы хотите, например, анимировать альфа-свойство, но не хотите использовать пользовательскую функцию плавности, вам придется с ней повозиться или, возможно, вообще придумать другое решение.
Наконец, замечательный инструмент для простого создания и тестирования функций плавности можно найти здесь: http://matthewlein.com/ceaser/
person
lucien
schedule
31.05.2013
-actionForKey:forLayer:
(или как он там называется), чтобы обеспечить правильную анимацию всякий раз, когда изменение свойства производится из переданного блока анимации... Вот с чего я бы начал в любом случае - person nielsbot   schedule 22.09.2012