0

在我的 iOS 应用程序中,我的Toast视图很像 Android 上的 toasts。当 Toast 出现时,它会在屏幕的一个小区域显示几秒钟,然后自动关闭。Toast 有两个主要属性:

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

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

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

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

4

1 回答 1

0

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

于 2019-12-10T18:41:26.697 回答