アニメーション化されているビューの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
ます。
parasiteArea
の親ビュー(CAAnimation
ビューの移動、ビューのスケール、およびビューの回転で構成される)をアニメートすると、タッチは予想されるサブビューの範囲外になります。
アップデート
presentationLayer
プロパティと を使用して、ほとんどの場合(上記のコードを参照)検出を機能させるように管理しましたCGPointApplyAffineTransform
。ただし、それでも機能しない場合があります。
タッチポイントをの座標空間に変換する必要があると思いCAAnimation
ます。
またはそのようなもの?助言がありますか?