【问题标题】:Control a UIView animation's progress manually instead of automatically through the time duration手动控制 UIView 动画的进度,而不是通过持续时间自动控制
【发布时间】:2014-05-04 07:42:28
【问题描述】:

我想设置一个 UIView 动画,但不是花费给定的时间,我想控制百分比进度并让它自动为我插入值。那可能吗?谢谢

【问题讨论】:

  • 对于动画你最终需要定义时间,那就是animation time

标签: ios iphone objective-c uiview core-animation


【解决方案1】:

如果您谈论的是与某个手势识别器相关联的简单 UIView 动画,您通常不会在手势期间使用动画,而是在收到更新为连续手势时更新视图的属性(例如 @987654322 @) 进行,然后仅在您放手并希望完成用户手动启动的动画时才应用传统动画。您不需要在连续手势期间使用动画,因为这些事件来得足够快,可以在手势期间呈现视图属性的平滑变化。当用户放手并且您希望动画顺利地继续到其合乎逻辑的结论时,您只需要传统动画。

或者,如果您谈论的是新的 iOS 7 视图控制器转换(一个稍微复杂、非常专业的场景),您 (a) 设置一个动画对象(符合 UIViewControllerAnimatedTransitioning 的对象); (b) 设置一个交互控制器(符合UIViewControllerInteractiveTransitioning,例如UIPercentDrivenInteractiveTransition); (c) 你的手势会更新交互控制器的percentComplete; (d) 手势完成后,您只需根据自己的逻辑调用cancelInteractiveTransitionfinishInteractiveTransition

【讨论】:

  • 非常感谢,这基本上完美地解释了我的情况。问题是我在 ios7 转换方面遇到了很多问题,我确信这是由 UIKit 错误引起的,并且还需要支持 ios6,所以我正在尝试执行类似的操作。
  • 迄今为止我偶然发现的唯一视图控制器转换错误是与布局指南相关的一些奇怪行为。但是,如果您支持 iOS 6,那就没有意义了,因为您必须通过不同的机制来实现它。如果您只是在视图控制器之间滑动,UIPageViewController 是一种以 iOS 6 兼容方式在视图控制器之间滑动的简单方法(尽管在动画方面受到限制)。这仅取决于您要拍摄哪种动画。
【解决方案2】:

我想我明白了。在 [UIView animate...] 块之后,立即在根视图上执行以下操作:

_view.layer.speed = 0.0;
_view.layer.timeOffset = [_view.layer convertTime:CACurrentMediaTime() fromLayer:nil];

要在刻度上设置点,请执行以下操作:

_view.layer.timeOffset = 0..1; (where 1 is the same value as the original duration)

然后继续,类似于以下内容:

CALayer *layer = _view.layer;
CFTimeInterval pausedTime = [layer timeOffset];
layer.speed = 1.0;
layer.timeOffset = 0.0;
layer.beginTime = 0.0;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
layer.beginTime = timeSincePause;

这一切都来自这里:https://developer.apple.com/library/ios/qa/qa1673/_index.html

【讨论】:

  • 这确实有效,但没有给我任何方法来取消转换,以使其完成块仍然被调用。
猜你喜欢
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多