在CAKeyframeAnimation之后定位UIView会导致显示毛刺

时间:2011-10-04 11:51:25

标签: ios cakeyframeanimation

我遇到了CAKeyframeAnimation的问题。在动画UIView的图层后,我想将UIView定位到我正在设置的位置,以便用户可以继续使用此UIView上的按钮。

我目前正在使用此代码:

    // Open animation
    CAKeyframeAnimation *openAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.translation.y"];
    openAnimation.fillMode = kCAFillModeForwards;
    openAnimation.duration = .55;
    openAnimation.delegate = self;
    openAnimation.removedOnCompletion = NO;


    openAnimation.values = [NSArray arrayWithObjects:
                            [NSNumber numberWithFloat:0.0],
                            [NSNumber numberWithFloat:58.0],
                            [NSNumber numberWithFloat:48.0], nil];

    openAnimation.keyTimes = [NSArray arrayWithObjects:
                              [NSNumber numberWithFloat:0.0],
                              [NSNumber numberWithFloat:0.62],
                              [NSNumber numberWithFloat:1.0], nil];

    openAnimation.timingFunctions = [NSArray arrayWithObjects:
                                     [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut], 
                                     [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut], nil];

    [locationView.layer addAnimation:openAnimation forKey:@"OPEN_ANIMATION"];

委托方法:

- (void)animationDidStop:(CAKeyframeAnimation *)anim finished:(BOOL)flag
{
    locationView.y = -10.0;
}

这实际上有效,但最后我有这个显示故障,动画被删除(UIView层跳回到原始位置)并立即调用委托方法,这使它跳转到最终位置。

我觉得最后的过程如下:动画完成,渲染动画的最后一帧,跳回原始位置,渲染此帧,调用委托方法并将uiview放在最终位置

如何修复此显示故障?

1 个答案:

答案 0 :(得分:4)

在将动画添加到图层之前,我会尝试设置结束位置。假设您要更改position函数中图层的animationDidStop,我会更改这些行

// Set end position for layer

CAKeyframeAnimation *openAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position.y"];
openAnimation.fillMode = kCAFillModeBackwards;
//openAnimation.removedOnCompletion = NO;

// The rest of your code

它们的密钥路径在此非常重要,因为您必须将图层的相同属性设置为密钥路径(在本例中为position)。否则,fillmode将无法正常工作。