Анимация размытия по Гауссу с использованием базовой анимации? - PullRequest
10 голосов
/ 19 июля 2011

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

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"];

Ответы [ 2 ]

9 голосов
/ 19 июля 2011

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

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

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

blurAnimation.delegate = self;

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

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {
    [[self layer] setFilters:nil];
}
2 голосов
/ 03 мая 2013

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

...