【问题标题】:Limit effect of UIPercentDrivenInteractiveTransition to topmost view将 UIPercentDrivenInteractiveTransition 的效果限制为最顶层视图
【发布时间】:2015-01-07 01:18:14
【问题描述】:

有没有办法将UIPercentDrivenInteractiveTransition 的效果限制在视图层次结构中的最顶层视图?

具体来说:正如herehere 所解释的那样,交互式转换将容器视图层的speed 设置为0,然后操纵timeOffset 以擦洗转换。

例如,如果我在该包含视图中有一个活动指示器,则交互式过渡也会擦洗活动指示器的旋转动画。它停止旋转,并且似乎随着交互式过渡向前和向后“滚动”。

有没有办法本地化设置speedtimeOffset 的效果并防止它们传播到任何或所有子视图?

到目前为止,我能想到两种可能的方法:

  1. 创建一个“屏障”层:子类 CALayer 并覆盖 setTimeOffset: 以防止或有选择地防止更改

  2. UIPercentDrivenInteractiveTransition 子类化或替换为遍历子视图层次结构并选择性地仅命中某些视图的内容

欢迎任何其他想法。

【问题讨论】:

    标签: ios uikit core-animation


    【解决方案1】:

    您应该告诉活动动画师在过渡期间停止动画,但保持其可见。这与 Apple 在其应用程序中处理此问题的方式一致。例如,在邮件应用程序中,执行下拉刷新以获取新邮件。当指示器旋转时,使用交互式弹出手势识别器到大约一半。请注意,活动指示器在交互式转换期间停止。

    【讨论】:

    • 我也喜欢这个提议。如果 OP 不想隐藏动画师,他可以在过渡期间停止动画。
    • 这是一个很好的建议,您可以免费获得这种行为(时间同步)真是太棒了,但我希望这个问题能更笼统一些。例如,您可能不希望 AVPlayerLayer 擦洗,但目前正在传播的 timeOffset 这样做。
    【解决方案2】:

    为什么不在动画期间隐藏活动指示器?当然,它在那里没有任何目的,不是吗?毕竟,它不能表示“动画正在进行中”——用户不会感觉到这是一个动画,甚至不是一个耗时的过渡,而是一个手指驱动的手势。通过使用动画的完成处理程序,您可以在动画结束时轻松地再次显示它。

    【讨论】:

    • 好主意。在这种情况下,虽然它意味着“正在进行的网络流量”并且您将其隐藏以取消操作。理想情况下,您可以改变主意,直到您抬起手指并完成过渡。
    • 不应该是那个意思。如果网络流量正在进行中,请使用 UIApplication 的 networkActivityIndicatorVisible - 这就是它的用途。
    • 同意。在这种情况下,它显示一个特定的图像正在加载几个
    • 但我仍然认为,在手势过程中使用微调器向用户展示这一事实并不是你的工作。用户很忙。您不必表明该应用程序也很忙。
    • 嗯,这很好。我更倾向于“无缝”的交互式过渡体验,但从哲学上讲你是对的。
    【解决方案3】:

    这个问题的答案是否定的。根据AppleCALayer 类采用CAMediaTiming“允许层定义相对于其超层的时间空间”。换句话说,在子层中指定的timeOffsetbeginTime 的任何值都会与上面的层相加。正如文档所述,“层树时间空间的这一概念提供了一个可扩展的时间线,从根层开始,一直到其后代。”

    UIPercentDrivenInteractiveTransition 的作用是擦洗[transitionContext containerView].layertimeOffset。 (transitionContextid<UIViewControllerContextTransitioning>)。

    因此,它应用了一个时间偏移量,然后子层链下的所有子层都会自动采用该时间偏移量。

    没有所谓的“障碍”或“选择性地只击中某些层”,因为这种时间传播是由核心动画内部处理的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      相关资源
      最近更新 更多