使用CAAnimation启用用户交互?

时间:2012-06-19 22:37:06

标签: iphone objective-c ios core-animation

在使用基于块的动画的选项字段进行动画制作时,允许用户与视图进行交互非常容易。但在我的程序中,我使用的是CAKeyframeAnimation,我没有看到任何属性来设置用户交互。有没有办法做到这一点?

谢谢,

编辑:这是实际代码:

- (void)move
{
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, 50, 120);
    for (int i = 0; i < 5; i ++)
        CGPathAddLineToPoint(path, NULL, arc4random() % 320, arc4random() % 480);
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    [animation setPath:path];
    [animation setDuration:10];
    CFRelease(path);
    [self.layer addAnimation:animation forKey:@"move"];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self setAlpha:0];
}

2 个答案:

答案 0 :(得分:1)

你最有可能触碰到错误的地方。当图层在屏幕上设置动画时,值永远不会改变,因此视图实际上位于从头开始的位置,而不是屏幕上显示的位置。

我几个月前在how to hit test animating layers上发了一篇博客文章。它描述了你想要做的确切事情。

您需要将超级视图添加触摸处理(或手势识别器)并自行对presentationLayer进行点击测试,以确定用户是否点击了视图在屏幕上显示的位置。

答案 1 :(得分:0)

显然,预览解决方案不再适用于Swift 3.x和Swift 4.x

我解决了设置Timer以在动画期间更新帧的问题。

//Timer: To update the UI frame
    Timer.scheduledTimer(timeInterval: 0.15, target: self, selector: #selector(updateFrame), userInfo: nil, repeats: true)

//Timer Selector
@objc func updateFrame(){
   //getting the layer presentation bounds
    let layer = "button, label...".layer.presentation()!

    let point = CGPoint(x: layer.frame.origin.x, y: layer.frame.origin.y)
    let size = CGSize(width: layer.frame.width, height: layer.frame.height)
    // Update the UI element frame location
    "ui element".frame = CGRect(origin: point, size: size)
}