4

我有一个 UIView 和几个 UILabel 从上到下动画,反之亦然。一种 Autoque 让我们说 :) 我使用 2 个功能:

-(void)goUp 
-(void)goDown 

这些函数将 UIView 动画启动到所需的位置。它们都定义了一个AnimationDidStopSelector,它在最后调用另一个函数。这一切都很顺利。

触摸屏幕时,使用 touchesBegan,我想暂停当前动画并使用 touchesMoved 事件更改 UIView 的垂直位置。在 touchesEnded 中,我想将动画恢复到所需的结束位置。

这样做的正确方法是什么?

托马斯

4

5 回答 5

7

我在 UIView 上创建了一个类别来暂停和停止动画:

@interface UIView (AnimationsHandler)

- (void)pauseAnimations;
- (void)resumeAnimations;

@end

@implementation UIView (AnimationsHandler)
- (void)pauseAnimations
{
    CFTimeInterval paused_time = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];
    self.layer.speed = 0.0;
    self.layer.timeOffset = paused_time;
}

- (void)resumeAnimations
{
    CFTimeInterval paused_time = [self.layer timeOffset];
    self.layer.speed = 1.0f;
    self.layer.timeOffset = 0.0f;
    self.layer.beginTime = 0.0f;
    CFTimeInterval time_since_pause = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil] - paused_time;
    self.layer.beginTime = time_since_pause;
}
于 2014-11-01T15:42:14.657 回答
4

实际上,您仍然可以UIView根据 Vladimir 链接到的问题的答案暂停动画,因为它会在我实现所有动画之后暂停我CABasicAnimations的动画,然后添加一些我认为不会的动画暂停,但他们也没有工作。这是相关链接UIViewCABasicaAnimationsUIView

我想暂停我的整个视图,所以我self.view.layer作为要暂停的图层通过。但是对于那些不了解CALayer's 的人,请传入view.layer你想要暂停的那个。每个UIView都有一个CALayer,所以只需传入view.layer与您相关的最上层。在 Thomas 的情况下,根据您自己的回答,您似乎希望通过self.containerView.layer暂停。

之所以可行,是因为UIView动画只是核心动画之上的一层。至少这是我的理解。

希望这有助于未来的人们想知道如何暂停动画。

于 2011-01-13T06:03:22.483 回答
2

弗拉基米尔,关于 CAAnimations 的问题是有道理的。但我找到了一种“暂停”的方法,所以我可以继续使用 UIView 动画:

CALayer *pLayer = [self.containerView.layer presentationLayer];
CGRect frameStop = pLayer.frame;
pausedX = frameStop.origin.x;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.01];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];     
// set view properties

frameStop.origin.x = pausedX;
self.containerView.frame = frameStop;
[UIView commitAnimations];

我在这里做的是使用presentationLayer 找出动画视图的当前x 值。之后,我执行一个覆盖原始动画的新动画。确保为此设置了 setAnimationBeginsFromCurrentstate:YES。这会取消原始动画并将动画视图放置到它的目标位置(它会自动执行),而是放在动画过程的当前位置。

希望这对其他人也有帮助!:)

于 2010-07-09T12:32:41.927 回答
1

我不确定是否可以直接使用 UIView,但您绝对可以改为使用动画视图的 CALayers。请参阅有关暂停和恢复 CAAnimations 的这个问题。

于 2010-07-09T08:39:13.877 回答
0

希望它会帮助你。

- (void)goUP{
    CFTimeInterval pausedTime = [self.layer timeOffset];
    self.layer.speed = 1.0;
    self.layer.timeOffset = 0.0;
    self.layer.beginTime = 0.0;
    CFTimeInterval timeSincePause = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
    self.layer.beginTime = timeSincePause;
}

- (void)goDown{
    CFTimeInterval pausedTime = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];
    self.layer.speed = 0.0;
    self.layer.timeOffset = pausedTime;
}

当您调用图层动画时,它将影响所有图层树和子模式图层动画。

于 2014-06-12T14:01:00.827 回答