使用 CAAnimation 检测正在动画的 uiview 子视图的触摸

Posted

技术标签:

【中文标题】使用 CAAnimation 检测正在动画的 uiview 子视图的触摸【英文标题】:detect touch of subview of uiview being animated using CAAnimation 【发布时间】:2013-03-02 19:05:23 【问题描述】:

我正在尝试检测动画视图的 UISubview 上的触摸

这是我的检测代码:

//simple but not very elegant way of getting correct frame
CGRect keepFrame = self.fishContainer.layer.frame;
self.fishContainer.layer.frame = [[self.fishContainer.layer presentationLayer] frame];

//get touch location, taking presentation layer into account. (See above)
CGPoint p = [sender locationInView:self.fishContainer];
CALayer *layer =[self.fishContainer.layer presentationLayer];

//apply relevant transform
p = CGPointApplyAffineTransform(p,layer.affineTransform);
    EBLog(@"checking point %@",NSStringFromCGPoint(p));
UIView *vToRemove = nil;

//find topmost view containing touched point
for (UIView *v in self.parasites) 
    EBLog(@"-BOUND %@",NSStringFromCGRect(v.frame));

    if(CGRectContainsPoint(v.frame, p))
    
        vToRemove = v;
    

//OK, we have a view. Let's remove it.
if(vToRemove)

    EBLog(@"found one");
    [vToRemove removeFromSuperview];
    [self.parasites removeObject:vToRemove];
    if ([self.parasites count] == 0) 
        [self showWinnerScreen];
        [self stopGame];
    


//restore view frame
self.fishContainer.layer.frame = keepFrame;

只要我不对parasiteArea parentview 设置动画,一切都会正常工作。

当我为parasiteArea 的父视图(A CAAnimation 包括视图的移动、视图的缩放和视图的旋转)设置动画时,触摸超出了预期子视图的范围。

更新

通过使用presentationLayer 属性和CGPointApplyAffineTransform,我设法在大多数情况下使检测工作(参见上面的代码)。但是,在某些情况下它仍然不起作用。

我想我需要将触摸点转换为CAAnimation 的坐标空间。

或者类似的东西?有什么建议吗?

【问题讨论】:

您可以通过检查其presentationLayer 的框架来获得动画层的正确瞬时表示 - 检查该属性上的 CALayer 引用。 您好。谢谢你的评论。这实际上是我现在正在结合 CGPointApplyAffineTransform 进行的工作。但是,它并非在所有情况下都有效。仍在试图找出原因 【参考方案1】:

我最终使用UIView animateWithDuration 而不是CAAninmation。就我的目的而言,有限的动画可能就足够了。

【讨论】:

以上是关于使用 CAAnimation 检测正在动画的 uiview 子视图的触摸的主要内容,如果未能解决你的问题,请参考以下文章

使用 CAAnimation.CurrentMediaTime() 更改显式动画的速度

UI基础--动画(缩放动画, 渐变动画, 左右振动, 移动动画, 组合动画)(封装好)

CALayer (CAAnimation) 动画属性绘制错误

CAAnimation 跟踪进度

CAAnimation - 更改动画最后一帧的属性?

CAAnimation 在一个点上进行变换旋转