Анимирование гауссовского размытия с использованием базовой анимации?

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

CABasicAnimation* blurAnimation = [CABasicAnimation animation];
CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
[blurFilter setDefaults];
[blurFilter setValue:[NSNumber numberWithFloat:0.0] forKey:@"inputRadius"];
[blurFilter setName:@"blur"];
[[self layer] setFilters:[NSArray arrayWithObject:blurFilter]];

blurAnimation.keyPath = @"filters.blur.inputRadius";
blurAnimation.fromValue = [NSNumber numberWithFloat:10.0f];
blurAnimation.toValue = [NSNumber numberWithFloat:1.0];
blurAnimation.duration = 1.2;

[self.layer addAnimation:blurAnimation forKey:@"blurAnimation"];

Ответ 1

Ваша проблема в том, что анимация останавливается и автоматически удаляется, но фильтр задерживается с минимальным применением размытия.

Что вы хотите сделать, так это удалить фильтр размытия после завершения анимации. Вам нужно добавить делегата в экземпляр CABasicAnimation и реализовать метод -[id<CAAnimationDelegate> animationDidStop:finished:].

Если вы даете self быть делегатом, в этом случае это должно быть довольно просто, добавьте эту строку перед добавлением анимации в ваш слой:

blurAnimation.delegate = self;

И обратный вызов одинаково прост:

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {
    [[self layer] setFilters:nil];
}

Ответ 2

Если вы ищете оптимизированный способ анимации размытия, я рекомендую создать одно размытое изображение вашего вида, а затем затухать размытое изображение от альфы от 0 до 1 в верхней части исходного вида. Кажется приятным и быстрым в тестах.