質問

I'm trying to detect a touch on a UISubview of a view being animated

Here's my detection code:

//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;

Everything works correctly as long as I don't animate parasiteArea parentview.

When I animate parasiteArea's parentview (A CAAnimation consisting of move of the view, scale of the view, and rotate of the view) , the touch is outside the bounds of the expected subview.

UPDATE

I manged to get the detection working in most cases (see code above), by using the presentationLayer property and CGPointApplyAffineTransform. There is however, still some cases where it dosnt work.

I guess I need to translate the touch point to the coordinate space of the CAAnimation.

Or something like that? any suggestions?

役に立ちましたか?

解決

I ended up using UIView animateWithDuration instead of CAAninmation. For my purpose the limited animation possibles were enough.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top