2010-11-30 3 views
7

저는 UIImageView를 상속하는 드래그 가능한 클래스가 있습니다. 보기가 움직이지 않을 때 드래그가 잘 작동합니다. 그러나 애니메이션을 적용하면 감동에 반응하지 않습니다. 애니메이션이 완료되면 터치가 다시 작동합니다. 하지만 터치가 끝나면 애니메이션을 일시 중지하고 다시 시작해야합니다. 나는 하루 종일 그것을 연구했지만 그 이유를 알 수 없었다.애니메이션 도중 UIView touchesbegan이 응답하지 않습니다.

여기 내 애니메이션 코드입니다. 애니메이션이 시작될 때 IOS는, 목표 위치에 생기를보기를 배치하기 때문에, 그러나 경로를 그립니다

[UIView animateWithDuration:5.0f 
    delay:0 
    options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction) 
    animations:^{ 
    self.center = CGPointMake(160,240); 
    self.transform = CGAffineTransformIdentity; 
    } 
    completion:nil 
]; 

- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { 
    NSLog(@"touch"); 
    CGPoint pt = [[touches anyObject] locationInView:self]; 
    startLocation = pt; 
    [self.layer removeAllAnimations]; 
    [[self superview] bringSubviewToFront:self]; 
} 

답변

9

. 따라서 이동하는 동안보기를 탭하면 실제로 프레임 밖으로 도청됩니다.

애니메이션보기의 init에서 userInteractionEnabled를 NO로 설정하십시오. 터치 이벤트는 슈퍼 뷰에서 처리됩니다.

self.userInteractionEnabled = NO; 

superview의 touchesBegan 메소드에서 애니메이션보기의 presentationLayer 위치를 확인하십시오. 터치 위치와 일치하는 경우 touchesBegan 메시지를 해당보기로 리디렉션합니다.

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    CGPoint point = [[touches anyObject] locationInView:self.view]; 
    CGPoint presentationPosition = [[animatingView.layer presentationLayer] position]; 

    if (point.x > presentationPosition.x - 10 && point.x < presentationPosition.x + 10 
     && point.y > presentationPosition.y - 10 && point.y < presentationPosition.y + 10) { 
     [animatingView touchesBegan:touches withEvent:event]; 
    } 
} 
+0

브릴리언트. 감사! – bzlm

+0

btw 위치가 애니메이션이 아니지만 다른 속성 (내 프레임의 경우)이더라도 ...이 문제가 생겼습니다 ... 뷰의 'hitTest'및 'pointInside' 메소드가 호출되어 제대로 반환됩니다. 또한, 나는 단지'if ([view pointInside : point withEvent : event])'- 10 포인트의 슬롭 필요 없음 – AlexChaffee