【发布时间】: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 元素之前不知何故陷入了死胡同。我的猜测是这与占用主线程的动画有关,但无论哪种方式,我都希望听到有关如何解决此问题的建议。
【问题讨论】:
标签: ios swift animation uiwindow uiviewpropertyanimator