Размещение UIView после CAKeyframeAnimation приводит к сбоям в отображении

У меня проблема с CAKeyframeAnimation. После анимации слоя UIView я хотел бы расположить UIView в позиции, в которой я анимирую, чтобы пользователь мог продолжать использовать кнопки на этом UIView.

В настоящее время я использую этот код:

    // Open animation
    CAKeyframeAnimation *openAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.translation.y"];
    openAnimation.fillMode = kCAFillModeForwards;
    openAnimation.duration = .55;
    openAnimation.delegate = self;
    openAnimation.removedOnCompletion = NO;


    openAnimation.values = [NSArray arrayWithObjects:
                            [NSNumber numberWithFloat:0.0],
                            [NSNumber numberWithFloat:58.0],
                            [NSNumber numberWithFloat:48.0], nil];

    openAnimation.keyTimes = [NSArray arrayWithObjects:
                              [NSNumber numberWithFloat:0.0],
                              [NSNumber numberWithFloat:0.62],
                              [NSNumber numberWithFloat:1.0], nil];

    openAnimation.timingFunctions = [NSArray arrayWithObjects:
                                     [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut], 
                                     [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut], nil];

    [locationView.layer addAnimation:openAnimation forKey:@"OPEN_ANIMATION"];

И метод делегата:

- (void)animationDidStop:(CAKeyframeAnimation *)anim finished:(BOOL)flag
{
    locationView.y = -10.0;
}

Это действительно работает, но в конце у меня возникает этот сбой отображения, когда анимация удаляется (слой UIView возвращается в исходное положение) и мгновенно вызывает метод делегата, который заставляет его перейти в конечную позицию.

Мне кажется, что процедура в конце следующая: анимация завершается, визуализирует последний кадр анимации, возвращается в исходное положение, визуализирует этот кадр, вызывает метод делегата и помещает uiview в его конечную позицию.

Как я могу исправить этот глюк дисплея?


person polyclick    schedule 04.10.2011    source источник


Ответы (1)


Я бы попробовал установить конечную позицию, прежде чем добавлять анимацию к слою. Предполагая, что вы меняете position слоя в своей animationDidStop функции, я бы изменил эти строки

// Set end position for layer

CAKeyframeAnimation *openAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position.y"];
openAnimation.fillMode = kCAFillModeBackwards;
//openAnimation.removedOnCompletion = NO;

// The rest of your code

Путь к ним важен здесь, так как вы должны установить то же свойство слоя, что и путь к клавишам (в данном случае position). В противном случае режим заполнения будет работать некорректно.

person Patrick Hernandez    schedule 23.11.2011