在ViewController被解散时保持动画播放?

时间:2014-05-14 13:14:37

标签: ios caanimation

我想要继续播放CAKeyframeAnimation,因为我从屏幕左侧滑动手指(iOS 7中的向后滑动手势)。目前,当我向后滑动并且它保持静止时,它跳转到它的startPosition,它看起来相当草率。

ViewControllerdetailViewController我从另一个ViewController推出的detailViewController。当然,在我在后台解雇CGPoint startPoint = (CGPoint){160.f, 160.f}; CGPoint endPoint = (CGPoint){160.f, 15.f}; CGMutablePathRef thePath = CGPathCreateMutable(); CGPathMoveToPoint(thePath, NULL, startPoint.x, startPoint.y); CGPathAddLineToPoint(thePath, NULL, endPoint.x, endPoint.y); CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; animation.duration = 20.f; animation.path = thePath; animation.autoreverses = YES; animation.repeatCount = INFINITY; [self.myButton.layer addAnimation:animation forKey:@"position"]; 之后,我不希望动画播放。只有 才会被解雇。

这是我的动画:

{{1}}

非常感谢任何帮助,谢谢!

使用模式详细信息进行编辑:我在TableView之上有一个UIView(顺便说一句,我没有使用Storyboard)。在这个UIView里面是一个上下移动的UIButton。因此,UIView充当了一种“窗口”。看到UIButton上下移动。当我向后滑动时,当detailViewController向右移动时,我希望UIButton能够像往常一样继续动画。 (在tableView之上,我的意思是它位于tableView上方。它没有分层在它上面。)

2 个答案:

答案 0 :(得分:1)

UIButton* button = [[UIButton alloc]initWithFrame:CGRectMake(160, 0, 320, 540)];
[UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionAllowUserInteraction animations:^{
    button.frame = CGRectMake(160, 10, 320, 540);
} completion:^(BOOL finished) {
    // nothing to see here
}];

这可能是完成动画的最简单方法。你可能不得不摆弄不同的动画选项,但这是你想要的主旨。

答案 1 :(得分:1)

CAAnimations只更新按钮的表示层,而不是它的真实位置。我不知道有什么方法可以让他们继续在导航控制器的弹出过渡期间继续。

相反,我会使用NSTimerCADisplayLink来设置实际按钮位置的动画。一个简单的例子:

// in MyViewController.m

static CGFloat kButtonSpeed = 0.2f;
static CGFloat kButtonMinY = 15.f;
static CGFloat kButtonMaxY = 160.f;

- (void)initiateButtonAnimation
{
    if (_displayLink) {
        return;
    }

    _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(moveButton)];
    [_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}

- (void)moveButton
{
    if (_frameTimestamp == 0) {
        _frameTimestamp = [_displayLink timestamp];
        return;
    }

    if (!_renderFrame) {
        _renderFrame = !_renderFrame;
        return;
    }

    double currentTime = [_displayLink timestamp];
    double renderTime = currentTime - _frameTimestamp;
    _frameTimestamp = currentTime;
    CGFloat amount = renderTime * 60.f * kButtonSpeed;

    CGFloat y = self.myButton.center.y;

    if (!_moveButtonDown && y > kButtonMinY) {
        y = y - amount;
    }
    else if (_moveButtonDown && y < kButtonMaxY)
        y = y + amount;
    else
        _moveButtonDown = !_moveButtonDown;

    self.myButton.center = CGPointMake(self.myButton.center.x, y);
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];

    // don't forget to invalidate & release
    [_displayLink invalidate];
    _displayLink = nil;
}