在iOS中拖动时如何修改UIVisualEffectView的模糊程度?

7

目前,我正在使用UIVisualEffectView来对图像应用模糊效果。

我有一个UIScrollView。当我在scrollViewDidScroll方法中向下拉动scrollView时,我会改变UIVisualEffectView的alpha值。当前行为是,随着我在视图中拖动,模糊半径会平滑地改变。

问题是,我不应该这样做。会收到关于更改UIVisualEffectView的alpha值的警告。

我看到有人说要使用动画来平滑过渡模糊,就像这里所示:如何淡入淡出UIVisualEffectView和/或UIBlurEffect?

然而,我没有看到任何允许我在拖动等操作期间执行此操作的内容。我的意思是,如果我设置了一个定时数量的动画,那么一切都很好。但是在拖动期间这样做呢?

2个回答

9

有一种方法 :)

正如您所注意到的,您可以从nil效果动画到像UIBlurEffectStyleDark这样的效果,因此如果我们添加动画,然后暂停图层的动画,我们可以通过调整图层的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;
}
  • 注意:在不支持UIBlurEffect动画的iOS 8上,此方法将无法正常工作。

1
谢谢这个。这正是我在寻找的! - Dan Morrow
1
额外的注意事项:有时候似乎动画直到将 UIVisualEffectView 子视图添加到视图层次结构中才能正常工作。我通常在 viewDidLoad 中实例化和添加模糊效果,稍后在 viewDidAppear: 中添加动画。 - Warpling
我在Swift中使用相同的方法。然而,有一个bug - 当应用程序移动到后台,然后回来时,动画自动达到其结束状态,不再进行动画。你们遇到过这个问题吗?你们有什么解决办法吗? - suntime
@suntime 你可能需要防止动画被移除? - Warpling
1
@Warpling 我实现了一个解决方法,目前看起来很有效。简单来说:当应用程序进入后台时,我保存UITableView的contentOffset.y,并在回到前台时重新启动动画并将UITableView的contentOffset设置为保存的位置。一切都非常顺利。我知道这不是最好的解决方案,但我还没有找到更好的解决方法,已经寻找了几天。 - suntime
1
对于未来的访问者:UIViewPropertyAnimator 是更好的方法。请参见此答案:https://dev59.com/rF4c5IYBdhLWcg3wQYSC#60156668 - mattsven

0

虽然@DanMorrow提出的解决方案是有效的,但我遇到了一个奇怪的问题:当使用此解决方案的ViewController呈现另一个模型ViewController时,应用程序变得无响应。

当我删除了self.blurredEffectView.layer.speed = 0;这一行后,这个问题就消失了。奇怪的是,设置某个子视图的图层速度会影响由此ViewController呈现的模型ViewController。但是,在我的情况下,这显然是问题的根源。

正如@mattsven在他的评论中指出的,还有一种解决方案可以使用UIViewPropertyAnimator,可以在这个答案中找到。这种解决方案似乎更加专业,并且不会出现上述描述的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接