Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 重画_Ios_Core Animation - Fatal编程技术网

Ios 重画

Ios 重画,ios,core-animation,Ios,Core Animation,动画结束后,我遇到了对象消失的问题。如果动画结束了,一切都很好。但是我有一个动画,它连接到uipangestrerecognizer。如果用户平移超过屏幕宽度的33%,动画将继续。否则,动画将获得speed=-1,并实际到达其开始 问题是:如何强制图层重画 当我尝试开始新动画时,对象出现 我尝试在-(void)animationDidStop:(CAAnimation*)anim finished:(BOOL)标志中调用setNeedsDisplay: ,但运气不好 编辑 下面是一些代码。为了清

动画结束后,我遇到了对象消失的问题。如果动画结束了,一切都很好。但是我有一个动画,它连接到
uipangestrerecognizer
。如果用户平移超过屏幕宽度的33%,动画将继续。否则,动画将获得
speed=-1
,并实际到达其开始

问题是:如何强制图层重画

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

我尝试在
-(void)animationDidStop:(CAAnimation*)anim finished:(BOOL)标志中调用
setNeedsDisplay:
,但运气不好

编辑

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

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

当手势处于
UIgestureRecognitizerStateChanged
状态时,我们通过设置层的
速度来停止动画,并通过设置层的
时间偏移来控制动画的执行

当手势处于
UIgestureRecognitizerStateEnded
状态时,我们必须检查x上平移的平移是否超过屏幕宽度的33%。如果是,我们称之为
-(void)finishLayer:(CALayer*)层动画:(CAKeyframeAnimation*)动画withForward:(BOOL)shouldGoward
使用
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));
    }
}
下面是通过将层的
速度
设置回值1.0来发送动画的方法,或者如果我们想向后设置动画,则将
速度
设置为-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;
    }
}
所以,如果动画需要反向运行,它确实需要,但当它结束时,一切都消失了。在正向动画的情况下,一切都在其位置。添加动画后,我没有更改层的
位置
,也没有对动画使用
填充模式
,所以动画结束后,一切都应该和动画开始前一样,一切都发生在动画的表示层上

这里是一些截图。第一张图片上出现了平移手势。因为手指移动的距离小于屏幕宽度的33%,所以应该从这里开始反向动画。确实如此。我们在背景中设置
UITableView
的动画,它现在是空的,白色的
UILabel
和灰色的
UIImageView

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

您能提供您的代码和一些屏幕截图吗?@MaxMacLeod感谢您的关注。我编辑了我的帖子来解释我遇到的进一步问题