2

在使用基于块的动画的选项字段进行动画制作时,允许用户与视图交互非常容易。但是在我的程序中,我使用的是 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];
}
4

2 回答 2

1

你很可能碰错了地方。当图层在屏幕上动画时,该值永远不会改变,因此视图实际上定位在它从一开始的位置,而不是它出现在屏幕上的位置。

几个月前我写了一篇关于如何点击测试动画层的博文。它描述了您正在尝试做的确切事情。

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

于 2012-06-19T23:14:27.147 回答
0

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

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

//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)
}
于 2018-01-08T18:13:28.443 回答