CAAnimation重绘

时间:2015-07-09 11:44:20

标签: ios core-animation

动画结束后,我遇到了消失对象的问题。如果动画结束就好了。但我有动画连接到UIPanGesturerecognizer。如果用户平移超过屏幕宽度的33%,则动画继续播放。如果没有,动画获得speed = -1并实际开始。

问题是:如何强制图层重绘?

当我尝试开始新动画时,会出现对象。

我尝试在setNeedsDisplay:中拨打- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag ,但没有运气。

修改

这是一些代码。为了清洁,我只放了一个动画。一切正常。

所以,首先,这是我的手势处理程序。

当手势处于UIGestureRecognizerStateChanged状态时,我们通过设置图层的speed来停止动画,并通过设置图层的timeoffset来控制动画的执行。

当手势处于UIGestureRecognizerStateEnded状态时,我们必须检查x上的平移是否超过屏幕宽度的33%。如果是,我们用- (void)finishLayer:(CALayer*)layer animation:(CAKeyframeAnimation*)animation withForward:(BOOL)shouldGoForward 调用YES,这意味着动画应该继续到下一个屏幕,否则,我们会通过NO,这意味着向后动画到初始状态。

- (void)panGestureHandler:(UIPanGestureRecognizer*)recognizer
{
    if (recognizer.state == UIGestureRecognizerStateEnded)
    {
        //if our gesture was enough to let animation roll to its end
        if (fabsf(translation.x) > CGRectGetWidth(self.view.frame) * 0.33)
        {
            [self finishLayer:categoryControllerMain.view.layer animation:menuOpenSwipeAnimateMoveLeft withForward:NO];
        }
        //finger movement was below .33% of screen width so animate to initial state
        else
        {
            [self finishLayer:categoryControllerMain.view.layer animation:menuOpenSwipeAnimateMoveLeft withForward:NO];

        }
    }
    else if (recognizer.state == UIGestureRecognizerStateChanged)
    {
        //We put layer speed to zero so we can control animation with timeoffset in relation to finger pan movement
        categoryControllerMain.view.layer.speed = 0.0;
        [categoryControllerMain.view.layer addAnimation:menuOpenSwipeAnimateMoveLeft forKey:@"menuOpenMoveLeft"];
        categoryControllerMain.view.layer.timeOffset = fabs(translation.x / CGRectGetWidth(self.view.frame));
    }
}

这是通过将图层的speed设置回值1.0来向其结束发送动画的方法,或者如果我们想要向后设置动画,我们将speed设置为-1.0。我们还想设置beginTime,以便在我们结束平移手势后,动画知道继续的确切时间。

- (void)finishLayer:(CALayer*)layer animation:(CAKeyframeAnimation*)animation withForward:(BOOL)shouldGoForward
{

    pan.enabled = NO;
    if (shouldGoForward)
    {
        //animation continues
        CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
        layer.timeOffset = 0.0;
        layer.beginTime = 0.0;
        CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
        layer.beginTime = timeSincePause;
        layer.speed = 1.0;
    }
    else
    {
        //we want to take it back
        layer.timeOffset = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
        layer.beginTime = CACurrentMediaTime();
        layer.speed = -1;
    }
}

因此,如果动画需要向后运行,它确实会这样做,但是当它结束时,一切都会消失。在前向动画的情况下,一切都在它的位置。添加动画后,我没有更改图层的position,并且我没有在动画上使用fillMode,因此在动画结束后,一切都应该像动画开始之前一样,一切都发生在表示层上动画。

以下是一些截图。第一张图像上有平移手势。由于手指移动不到屏幕宽度的33%,因此应该开始向后动画。确实如此。我们动画显示UITableView现在为空,白色UILabel以及背景中的灰色UIImageView

Pan gesture in progress

平移手势结束后,动画开始向后滚动,当它结束时,动画的所有内容都会消失。另一方面,如果我们平移超过33%的屏幕宽度,动画会前进,我可以看到我的UITableView。这是向后动画结束的照片。 enter image description here

0 个答案:

没有答案