Как я могу использовать пользовательские анимации для onOrderOut в Core Animation? - PullRequest
8 голосов
/ 28 октября 2008

Базовая анимация позволяет создавать собственные анимации путем реализации метода actionForKey в вашем классе на основе CALayer:

- (id<CAAction>)actionForKey:(NSString *)key {
    // Custom animations
    return [super actionForKey:key];
}

Затем я могу создать анимацию и вернуть ее для действия onOrderIn (т. Е. Когда слой добавляется в другой слой). Это работает просто отлично. Если я сделаю то же самое для onOrderOut (т.е. слой будет удален из своего суперслоя), возвращенная анимация игнорируется, и вместо нее применяется анимация по умолчанию.

Моя цель - увеличить (onOrderIn) и уменьшить (onOrderOut) слой:

- (id<CAAction>)actionForKey:(NSString *)key {

    if ([key isEqualToString:@"onOrderIn"] || [key isEqualToString:@"onOrderOut"]) {
        CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
        a.duration = 0.25;
        a.removedOnCompletion = NO;
        a.fillMode = kCAFillModeBoth;

        if ([key isEqualToString:@"onOrderIn"]) {
            a.fromValue = [NSNumber numberWithFloat:0.0];
            a.toValue = [NSNumber numberWithFloat:1.0];
        } else {
            a.fromValue = [NSNumber numberWithFloat:1.0];
            a.toValue = [NSNumber numberWithFloat:0.0];
        }

        return a;
    }

    return [super actionForKey:key];
}

Увеличение работает, уменьшение - нет. Вместо этого используется анимация затухания по умолчанию.

Код может содержать некоторые опечатки, так как я набираю это на другом компьютере.

Может кто-нибудь помочь?

Ответы [ 2 ]

4 голосов
/ 16 августа 2009

Цитирование Джона Харпера из списка рассылки quartz-dev :

Есть фундаментальная проблема с возвращая любую анимацию для ключ onOrderOut - к тому времени, когда анимация должна быть запущена, слой больше не в дереве, поэтому он не имеет эффект. Так что onOrderOut не полезен для запуска анимации; это может быть полезно для запуска другого кода, когда слои удаляются из дерева.

Лучшее решение, которое я нашел для этого (при условии перехода по умолчанию затухания на родителя не то что ты хочешь, что это часто не так), чтобы добавить пользовательский анимации для применения эффекта удаления Вы хотите, то в DidStop делегат анимации, фактически удалить слой. Это часто удобно создать единую группу анимаций с установленным свойством делегата, и FILLMODE = вперед, removeOnCompletion = НЕТ, чтобы вы могли удалить слой в конце анимация без возможности слой еще виден в его нормальное состояние.

Если вы делаете это во многих случаях, легко написать общий суперкласс, который запускает анимацию, устанавливает делегат анимации для класса и реализует + animationDidStop:, чтобы удалить слой без включенной анимации. Это восстанавливает примитивную природу CoreAnimation, которая, как вы надеялись, будет присутствовать в реализации по умолчанию.

0 голосов
/ 29 октября 2008

Проверено ли, что ваш метод вызывается с key как @"onOrderOut" и что ваш метод возвращает правильную анимацию?

...