CALayer преобразование неправильно после возврата к экрану - PullRequest
0 голосов
/ 27 октября 2011

У меня есть 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.

...