我正在用iPhone尝试动画的东西,我有一个小的应用程序,它有从屏幕顶部到底部的圆圈。我在动画中添加了UIViewAnimationOptionAllowUserInteraction
选项,并在子视图和主视图上都设置了userInteractionEnabled = YES
。每次我的NSTimer触发时,我都会以编程的方式生成子视图,这就形成了一个圆圈。
我遇到的问题是,即使我在我的主视图和子视图上实现了- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
,事件也只会在主视图上触发,无论我多么努力或多少次打破掉下来的圆圈。
我怎么才能让这个事件在我的圈子里触发呢?为什么触摸不会在顶部的视图上触发?
发布于 2012-02-20 08:35:09
问题是,当您使用核心动画(使用UIView
动画方法时隐式发生)执行“补间”动画时,新值将立即应用于已知的model layer tree。
动画被提交给Core Animation,下一次发生主运行循环时,Core animation会执行必要的渲染,使其看起来就像发生了动画一样。但实际上,视图的模型值(例如,它的frame
或transform
属性)会立即更改。
尝试点击屏幕底部按钮落地的位置(假设按钮在屏幕上完成)。如果这样做,它应该会像您预期的那样响应交互事件。
您可以通过不断触发计时器并在每一步应用小的更改来手动更改圆圈的框架。然而,这可能并不理想。
另一种选择是使用视图的层的presentationLayer
方法。这一层代表了我们在屏幕上看到的任何时间点的层的状态。不经意间,我想象您的主视图的触摸处理方法可以遍历每个子视图,并检查接触点是否与子视图层的表示层的框架相交。如果是这样,那就意味着有人“触摸”了你的子视图。
for (UIView *subview in self.subviews)
{
CALayer *presentationLayer = (CALayer *)[subview.layer presentationLayer];
if (CGRectContainsPoint(presentationLayer.frame, touchPoint)
{
// Found the subview the user touched
}
}
我应该注意到,presentationLayer
返回id
,因为表示层可能是CALayer
或它的任何子类。例如,如果您使用的是CAShapeLayer
,那么-presentationLayer
将返回一个CAShapeLayer
。尽管如此,只要将其转换为CALayer
就可以了,因为对于此任务而言,您所关心的就是检查它的frame
属性。
https://stackoverflow.com/questions/9354082
复制相似问题