将 UIPercentDrivenInteractiveTransition 的效果限制在最顶层视图
Limit effect of UIPercentDrivenInteractiveTransition to topmost view
有没有办法将 UIPercentDrivenInteractiveTransition
的效果限制在视图层次结构中的最顶层视图?
具体来说:如 here and here 所述,交互式过渡将容器视图层的 speed
设置为 0,然后操纵 timeOffset
来擦洗过渡。
例如,如果我在包含视图中有一个 activity 指示器,交互式过渡也会擦洗 activity 指示器的旋转动画。它停止旋转,似乎 "roll" 随着交互式过渡向前和向后。
有没有办法将设置 speed
和 timeOffset
的效果局部化并防止它们传播到任何或所有子视图?
到目前为止,我能想到两种可能的方法:
创建一个 "barrier" 层:子类 CALayer
并覆盖 setTimeOffset:
以防止或选择性地防止更改
子类化或替换 UIPercentDrivenInteractiveTransition
为遍历子视图层次结构并有选择地仅命中某些视图的东西
欢迎任何其他想法。
为什么不在动画持续时间内隐藏 activity 指示器?当然它在那里没有任何目的,是吗?毕竟,这并不意味着 "animation is in progress" - 用户不会将其视为动画,甚至不会将其视为耗时的过渡,而是将其视为由手指驱动的手势。通过使用动画的完成处理程序,您可以在动画结束时轻松地再次显示它。
你应该告诉 activity 动画师停止动画,但在过渡期间保持它可见。这与 Apple 在其应用程序中处理此问题的方式一致。例如,在邮件应用程序中,执行下拉刷新以获取新消息。当指示器旋转时,使用交互式弹出手势识别器大约一半。请注意,activity 指示器在交互转换期间停止。
这个问题的答案是否定的。根据Apple,CALayer
class采用CAMediaTiming
"allowing a layer to define a timespace relative to its superlayer"。换句话说,在子层中指定的 timeOffset
或 beginTime
的任何值都将与上面的层相加。正如文档所述,"This concept of a layer-tree timespace provides a scalable timeline that starts at the root layer, through its descendants."
UIPercentDrivenInteractiveTransition
通过擦除 [transitionContext containerView].layer
的 timeOffset
来发挥作用。 (transitionContext
是一个 id<UIViewControllerContextTransitioning>
)。
因此,它正在应用一个时间偏移量,然后子层链中的所有子层都会自动采用该时间偏移量。
没有"barrier"或"selectively hitting only certain layers"这样的东西,因为这次传播是由Core Animation内部处理的。
有没有办法将 UIPercentDrivenInteractiveTransition
的效果限制在视图层次结构中的最顶层视图?
具体来说:如 here and here 所述,交互式过渡将容器视图层的 speed
设置为 0,然后操纵 timeOffset
来擦洗过渡。
例如,如果我在包含视图中有一个 activity 指示器,交互式过渡也会擦洗 activity 指示器的旋转动画。它停止旋转,似乎 "roll" 随着交互式过渡向前和向后。
有没有办法将设置 speed
和 timeOffset
的效果局部化并防止它们传播到任何或所有子视图?
到目前为止,我能想到两种可能的方法:
创建一个 "barrier" 层:子类
CALayer
并覆盖setTimeOffset:
以防止或选择性地防止更改子类化或替换
UIPercentDrivenInteractiveTransition
为遍历子视图层次结构并有选择地仅命中某些视图的东西
欢迎任何其他想法。
为什么不在动画持续时间内隐藏 activity 指示器?当然它在那里没有任何目的,是吗?毕竟,这并不意味着 "animation is in progress" - 用户不会将其视为动画,甚至不会将其视为耗时的过渡,而是将其视为由手指驱动的手势。通过使用动画的完成处理程序,您可以在动画结束时轻松地再次显示它。
你应该告诉 activity 动画师停止动画,但在过渡期间保持它可见。这与 Apple 在其应用程序中处理此问题的方式一致。例如,在邮件应用程序中,执行下拉刷新以获取新消息。当指示器旋转时,使用交互式弹出手势识别器大约一半。请注意,activity 指示器在交互转换期间停止。
这个问题的答案是否定的。根据Apple,CALayer
class采用CAMediaTiming
"allowing a layer to define a timespace relative to its superlayer"。换句话说,在子层中指定的 timeOffset
或 beginTime
的任何值都将与上面的层相加。正如文档所述,"This concept of a layer-tree timespace provides a scalable timeline that starts at the root layer, through its descendants."
UIPercentDrivenInteractiveTransition
通过擦除 [transitionContext containerView].layer
的 timeOffset
来发挥作用。 (transitionContext
是一个 id<UIViewControllerContextTransitioning>
)。
因此,它正在应用一个时间偏移量,然后子层链中的所有子层都会自动采用该时间偏移量。
没有"barrier"或"selectively hitting only certain layers"这样的东西,因为这次传播是由Core Animation内部处理的。