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