在 UIView 动画期间难以允许用户交互

Posted

技术标签:

【中文标题】在 UIView 动画期间难以允许用户交互【英文标题】:Difficulty allowing user interaction during UIView animation 【发布时间】:2014-08-24 23:01:40 【问题描述】:

我正在努力弄清楚如何在视图动画化时允许用户与它进行交互。

情况如下:我有一个 UIView cardView 包含 card 子视图。 cards 是可拖动的磁贴,类似于 Tinder 中的卡片是可拖动/可滑动的。

我正在尝试使用animateWithDuration 通过动画到cardView.alpha = 0 淡出卡片。从逻辑上讲,这也会淡出所有子视图(card 对象)。在这种特定情况下,我只针对一个card 子视图。但是,在动画期间,我无法拖动/与card 交互。

这是我正在使用的代码:

UIView.animateWithDuration(
        duration,
        delay: 0,
        options: UIViewAnimationOptions.AllowUserInteraction,
        animations: self.cardView.alpha = 0
    ) 
        _ in
        println("Card faded out")
        card.removeFromSuperview()
    

为什么这不起作用?任何帮助将不胜感激。谢谢!!

【问题讨论】:

此代码是我的视图控制器中函数的一部分 - duration 已参数化。另外,我使用的是尾随闭包,而不是直接提供 completion 命令。很抱歉,如果这些事情中的任何一个引起了混乱。 【参考方案1】:

我想你可以在this previous post找到答案。

这篇文章的有趣之处在于:

默认情况下,UIView 的块动画会阻止用户交互,要绕过它,您需要将 UIViewAnimationOptionAllowUserInteraction 作为选项之一传递。

【讨论】:

感谢您的洞察,但请查看我的代码:我已经将其作为选项之一提供。 对于 swift 5...选项:[.allowUserInteraction],动画: ...【参考方案2】:

我通过将 alpha 设置为 0.1 而不是 0.0 来解决此问题。我不确定这是否适用于您的情况,但它表明事件处理代码认为视图不可见并且即使设置了 UIViewAnimationOptionAllowUserInteraction 标志也禁用交互。奇怪的是,将 alpha 设置为 0.01 不起作用,因此您必须保持在一个可见度阈值以上。

【讨论】:

这对我也有帮助。在动画块中将 alpha 设置为 0.1,在完成块中将 alpha 设置为 0.0 确实有效。【参考方案3】:

斯威夫特 5

UIView.animateKeyframes(withDuration: 0.5, delay: 0, options: [.repeat, .autoreverse, .allowUserInteraction], animations: 
        self.customButton.backgroundColor = .none
    , completion: nil)

【讨论】:

这就是答案。特别是.allowUserinteraction【参考方案4】:

问题在于 Alpha 值 0。接近零的 Alpha 值会将视图从视图响应器层次结构中移除。此处的解决方法是将 alpha 设置为:

self.cardView.alpha = 0.011

视图仍然不可见,但不会从响应者链中删除。根据我的测试,最低金额如下:

extension CGFloat 

    static let minAlphaForTouchInput: CGFloat = 0.010000001

【讨论】:

以上是关于在 UIView 动画期间难以允许用户交互的主要内容,如果未能解决你的问题,请参考以下文章

在 UIView.animateWithDuration() 期间启用手势识别器的用户交互

UIView 在用户交互后消失

在动画 UIView/CALayer 中处理触摸的最佳模式?

如何实现可交互的 UIView 隐式动画

UITextFields 间歇性地不允许用户交互

UIView 动画交互