在保持背景动态的同时为视图添加动画模糊

时间:2017-09-23 18:41:56

标签: ios uiview uikit core-graphics uivisualeffectview

我尝试实现自定义模糊视图,其中模糊半径可以设置动画,模糊视图可以叠加混合​​模式(CGBlendingModeCIFilter),同时保留任何在后台发生的动画/动作。

我首先尝试了UIVisualEffectView,但是如果没有访问private APIs,则无法动画半径,这很可能导致应用拒绝。

拍摄快照并应用效果的问题是视图是静态的,背景中的任何移动都会被模糊视图覆盖。

我还看了FlexMonkey's Blurable,但我的结果与快照相似。

任何指导都会非常有用。 干杯

编辑:我添加了一个gif来演示我想要制作的内容。从左到右移动的红色视图模糊并将其下方的内容相乘,同时显示动画发生在其后面的红色/蓝色方块上。

enter image description here

1 个答案:

答案 0 :(得分:1)

混合模式非常棘手,我不确定是否可以将它们应用到实时UIView(GPUImage 可能帮助),但动画模糊通过this method可以实现半径(介于0和UIVisualEffectView'完全模糊之间):

您可以将nil效果设置为UIBlurEffectStyleDark之类的效果,这样如果我们添加动画然后暂停图层的动画,我们就可以通过调整效果来控制效果的进度layer的timeOffset!

- (void) setupBlur {
    // Setup the blur to start with no effect
    self.blurredEffectView = [[UIVisualEffectView alloc] initWithEffect:nil];

    // Add animation to desired blur effect
    [UIView animateWithDuration:1.0 animations:^{
        [self.blurredEffectView setEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]];
    }];

    // Pause layer animations
    self.blurredEffectView.layer.speed = 0;
}

调整0.0到1.0之间的模糊(动画持续时间):

- (void) adjustBlur:(CGFloat)blurIntensity {
    self.blurredEffectView.layer.timeOffset = blurIntensity;
}

注意:这不会在iOS 8上工作,因为UIBlurEffect动画不受支持。