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

Posted

技术标签:

【中文标题】在iOS中拖动时如何修改UIVisualEffectView的模糊度?【英文标题】:How can blurriness of UIVisualEffectView be modified while dragging in iOS? 【发布时间】:2016-08-31 19:38:06 【问题描述】:

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

我有一个 UIScrollView。当我下拉滚动视图时,在我的“scrollViewDidScroll”方法中,我正在更改 UIVisualEffectView 的 alpha。当前的行为是,当我在视图中拖动时,模糊半径会平滑变化。

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

我看到有人说要使用动画来平滑过渡,就像这里这样:How to fade a UIVisualEffectView and/or UIBlurEffect in and out?

但是,我没有看到任何可以让我在此期间执行此操作的东西,比如泛手势或其他东西。我的意思是,如果我设置一个带有定时数量的动画,一切都很好。但是在拖拽期间这样做呢?

【问题讨论】:

【参考方案1】:

有办法:)

正如您所注意到的,您可以从 nil 效果动画到类似 UIBlurEffectStyleDark 的效果,因此如果我们添加动画然后暂停图层的动画,我们可以通过调整图层的 @ 来控制效果的进度987654323@!

- (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。

【讨论】:

谢谢。这正是我想要的! :D 附加说明:有时在将UIVisualEffectView 子视图添加到视图层次结构之前,动画似乎无法工作。我通常在viewDidLoad 中实例化并添加模糊,稍后在viewDidAppear: 中添加动画。 我在 Swift 中使用相同的方法。但是,有一个错误 - 当应用程序移动到后台,然后返回时,动画会自动达到其结束状态并且不再动画。你们有没有解决这个问题?你知道如何解决这个问题吗? @suntime 您可能需要防止动画被删除? @Warpling 我实现了一个解决方法,到目前为止它似乎正在工作。为了简单起见:当应用程序进入后台时,我保存了 UITableView 的 contentOffset.y,当它回到前台时,我重新启动动画并将 UITableView 的 contentOffset 设置为保存的位置。这一切都发生得非常顺利。我知道这不是最好的解决方案,但我还没有找到更好的解决方案,几天来一直在寻找解决方案。

以上是关于在iOS中拖动时如何修改UIVisualEffectView的模糊度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在按住空格键时仅在Leaflet中启用地图拖动?

如何在整个应用程序中禁用 iOS 11 拖动?

拖动和释放通知时,在 iOS 中调用 ApplicationBecomeActive

如何在 iOS 11 中禁用 UITextView 中的拖动

如何在 iOS 11 的 UITextfield 中启用拖动

如何使用 iOS11 的拖放 API 获取正在拖动的单元格的框架或中心