Анимирование гауссовского размытия с использованием базовой анимации?
Я пытаюсь оживить что-то там, где оно сначала размывается, а затем фокусируется. Я думаю, это работает нормально, но когда анимация выполнена, она все еще немного расплывчата. Я делаю это неправильно?
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 в верхней части исходного вида. Кажется приятным и быстрым в тестах.