3

アニメーション化されているビューの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ます。

またはそのようなもの?助言がありますか?

4

1 に答える 1

0

UIView animateWithDurationの代わりに使用することになりCAAninmationました。私の目的には、限られたアニメーションの可能性で十分でした。

于 2013-03-12T08:06:06.240 に答える