У меня есть UIView, к которому я применяю CAAnimation. animation - это экземпляр класса, который наследуется от CAKeyframeAnimation, путь к которому равен @ "transform.scale".
[[myView layer] addAnimation:animation forKey:@"animation key"];
[[myView layer] setValue:[NSNumber numberWithBool:finalScale] forKey:@"transform.scale"];
Как обычно, помимо добавления анимации, я устанавливаю значениетак что когда он закончится, он не вернется к исходному состоянию.
Это все работает хорошо.Однако, если я выйду из этого контроллера, а затем вернусь, каким-то образом этот слой применяет это преобразование дважды, поэтому он выглядит в 4 раза меньше, хотя текущее значение равно finalScale .
I 'мы попытались сохранить текущее преобразование в viewWillDisappear и применить его снова в viewWillAppear.Также пробовал это на viewWillAppear:
[myView.layer setTransform:CATransform3DIdentity];
Но ни один из них не работал.Похоже, что под капотом выполняется какой-то другой расчет матрицы, или я что-то упустил?
РЕДАКТИРОВАТЬ: Вот как я создаю анимацию:
double startValue = [[view.layer.presentationLayer valueForKeyPath:@"transform.scale"] doubleValue];
ExponentialAnimation *animation = [ExponentialAnimation animationWithKeyPath:@"transform.scale"
startValue:startValue
endValue:endValue
duration:kDuration];
[view.layer removeAnimationForKey:@"scale"];
[view.layer addAnimation:animation forKey:@"scale"];
[view.layer setValue:[NSNumber numberWithFloat:endValue] forKeyPath:@"transform.scale"];
ExponentialAnimation выглядиткак это:
@interface ExponentialAnimation : CAKeyframeAnimation
{
double _startValue;
double _endValue;
NSUInteger _steps;
}
@implementation ExponentialAnimation
@synthesize startValue=_startValue,
endValue=_endValue;
+ (id)animationWithKeyPath:(NSString *)keyPath
startValue:(double)startValue
endValue:(double)endValue
duration:(CGFloat)duration
{
return [[[self alloc] initWithKeyPath:keyPath
startValue:startValue
endValue:endValue
duration:duration] autorelease];
}
- (id)initWithKeyPath:(NSString *)keyPath
startValue:(double)start
endValue:(double)end
duration:(CGFloat)duration
{
if ((self = [super init]))
{
self.keyPath = keyPath;
self.duration = duration;
_startValue = start;
_endValue = end;
_steps = [self numberOfStepsForDuration:duration withFPS:kAnimationFPS];
[self calculateKeyFrames];
}
return self;
}
convertSteps просто создает массив значений для каждого ключевого кадра и добавляет его следующим образом:
[self setValues:values];
Когда исчезает viewController, view имеет масштабустановите значение 0,4 ( endValue в анимации).Когда я возвращаюсь, получение значения [view.layer valueForKeyPath: @ "transform.scale"] дает 0,4, но на самом деле вы видите что-то вроде 0,4 * 0,4.