在视图控制器演示动画期间响应触摸事件
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
以及UIViewControllerTransitioningDelegate
和UIViewControllerAnimatedTransitioning
实现的自定义动画来呈现toast。由于窗口填满了整个屏幕,我重写了它的point(inside point: CGPoint, with event: UIEvent?)
方法以始终返回false。这会将触摸事件传播到包含 toast 下方实际界面的键窗口。
当 toast 出现在屏幕上时,这很有效,但是(这就是问题所在)当 toast 在屏幕上和屏幕外动画时,键窗口中的 UI 被冻结。这意味着,如果用户在 toast 关闭时滚动浏览表格视图,则 UI 将挂起大约 0.5 秒。
我已经验证了触摸事件确实可以在动画期间传播到键窗口,但是它们在到达实际的 UI 元素之前不知何故陷入了死胡同。我的猜测是这与占用主线程的动画有关,但无论哪种方式,我都希望听到有关如何解决此问题的建议。
【问题讨论】:
【参考方案1】:您可以将 toast 子视图作为窗口上的视图。此外,您可以将 CGAfflineTransform 用于动画。
【讨论】:
以上是关于在视图控制器演示动画期间响应触摸事件的主要内容,如果未能解决你的问题,请参考以下文章
从应用程序中的故事板手动创建的视图控制器:didFinishLaunching 不响应触摸事件