动画结束后,我遇到了消失对象的问题。如果动画结束就好了。但我有动画连接到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
。
平移手势结束后,动画开始向后滚动,当它结束时,动画的所有内容都会消失。另一方面,如果我们平移超过33%的屏幕宽度,动画会前进,我可以看到我的UITableView
。这是向后动画结束的照片。