使用 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基础--动画(缩放动画, 渐变动画, 左右振动, 移动动画, 组合动画)(封装好)