在视图控制器演示动画期间响应触摸事件

Posted

技术标签:

【中文标题】在视图控制器演示动画期间响应触摸事件【英文标题】:Responding to touch events during view controller presentation animation 【发布时间】:2019-12-10 18:22:04 【问题描述】:

在我的 ios 应用程序中,我有一个 Toast 视图,其工作方式与 android 上的 toasts 非常相似。当 Toast 出现时,它会在屏幕的一个小区域显示几秒钟,然后自动关闭。 Toast 有两个主要属性:

    当 Toast 出现在屏幕上时,用户可以像以前一样在应用中导航。 toast 是粘性的,这意味着它无论如何都会在屏幕上停留指定的持续时间(即使在推送、弹出、呈现和关闭其他视图控制器时)。

为了实现“粘性”,toast 出现在 UIWindow 的子类中。更具体地说,我在自定义窗口的根视图控制器上调用present(toastViewController, animated: true, completion: nil),它使用我使用UIViewPropertyAnimator 以及UIViewControllerTransitioningDelegateUIViewControllerAnimatedTransitioning 实现的自定义动画来呈现toast。由于窗口填满了整个屏幕,我重写了它的point(inside point: CGPoint, with event: UIEvent?) 方法以始终返回false。这会将触摸事件传播到包含 toast 下方实际界面的键窗口。

当 toast 出现在屏幕上时,这很有效,但是(这就是问题所在)当 toast 在屏幕上和屏幕外动画时,键窗口中的 UI 被冻结。这意味着,如果用户在 toast 关闭时滚动浏览表格视图,则 UI 将挂起大约 0.5 秒。

我已经验证了触摸事件确实可以在动画期间传播到键窗口,但是它们在到达实际的 UI 元素之前不知何故陷入了死胡同。我的猜测是这与占用主线程的动画有关,但无论哪种方式,我都希望听到有关如何解决此问题的建议。

【问题讨论】:

【参考方案1】:

您可以将 toast 子视图作为窗口上的视图。此外,您可以将 CGAfflineTransform 用于动画。

【讨论】:

以上是关于在视图控制器演示动画期间响应触摸事件的主要内容,如果未能解决你的问题,请参考以下文章

呈现模式视图控制器时呈现视图控制器响应触摸事件

从应用程序中的故事板手动创建的视图控制器:didFinishLaunching 不响应触摸事件

UIImageView 的 UITextField 子视图没有响应触摸事件

图像视图没有响应触摸事件

UITextField 是不是消耗触摸事件?

动画 UIView 的内容未接收到触摸事件