2013-11-27 2 views
0

UITouch 지점을 따르는 UIButton을 만들고 있는데, 계속 누르고 있으면 애니메이션 경계가 내 터치 지점에 도달하여 거기에서 몇 가지 작업을 수행하고 싶습니다.CGRectContainsPoint 애니메이션 도중 UIButton에 대해

다음은 코드입니다.

UIButton에 항상 x, y 0이 표시됩니다.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [UIView beginAnimations:@"MoveAndStrech" context:nil]; 
    [UIView setAnimationDuration:1]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 

    if([touches count] == 1) { 
     UITouch *touch = [touches anyObject]; 
     self.uiButton.center = [touch locationInView:self.view]; 
    } 
    [UIView commitAnimations]; 

    UITouch *touchTemp = [touches anyObject]; 
    CGPoint pCurrent = [touchTemp locationInView:self.view]; 
    CGRect currentRect = self.uiButton.layer.bounds; 

    NSLog(@"Current Rect x:%f,Current y:%f", 
      currentRect.origin.x, 
      currentRect.origin.y); 
    NSLog(@"TouchPoint x:%f,TouchPoint y:%f", 
      pCurrent.x, 
      pCurrent.y); 

    if(CGRectContainsPoint(currentRect, pCurrent)) { 
     NSLog(@"Touched....in rect"); 
    } 
} 

감사 사라

답변

0

문제가 해결되지 않는 경우,

CGRect currentRect = self.uiButton.presentationLayer.frame; 

CGRect currentRect = self.uiButton.layer.bounds; 

CGRect currentRect = self.uiButton.frame; 

교체

또한 UIView 애니메이션 블록을 사용하지 않는 이유는 무엇입니까? 그것은 당신의 삶을 훨씬 쉽게하고 코드를 훨씬 깨끗하게 만들 것입니다.

+0

만약 내가 self.uiButton.frame을 사용한다면; 내가 CGRect currentRect = self.uiButton.presentationLayer.frame을 사용하면 true로 CGRectContainsPoint를 제공합니다. 그것은 나를 찾을 수없는 속성을 찾을 수 없습니다. – user3042604

+0

그래서'layer.presentationLayer'를 사용하십시오. 가서 조사 좀해라, 친구. –

0

몇 가지. 처음에는 커밋에 대한 호출을 놓쳤다 고 생각했습니다.

동일한 줄에 여러 진술을 넣지 마십시오. !!!! 이것은 매우 불쾌한 코드 습관으로 코드를 전부 읽는 것이 불가능하게합니다.

다음은 이전 스타일의 beginAnimations/commitAnimations 호출이 오래되었으므로 iOS 4 이상에서는 사용해서는 안됩니다. beginAnimations의 문서 인용 : 문맥 :

이 방법의 사용은 iOS 4.0 이상에서는 권장하지 않습니다. 대신 블록 기반 애니메이션 메서드 을 사용하여 애니메이션을 지정해야합니다.

양식의 새로운 블록 기반의 애니메이션 전화 ((animateWithDuration 사용되어야한다 :. 애니메이션을 :)

다음, UIView의 애니메이션 객체의 원인이 이동하는 애니메이션을

즉시 최종 위치의 그들은 단지 시각적으로 최종 위치로 이동하고 애니메이션 도중 사용자 상호 작용을 기본적으로 사용하지 않도록 설정합니다.

특정 시점에서 화면에 표시되는 위치를 파악하려면보기의 내용을 확인해야합니다 레이어의 animationLayer. sample project on Github (링크) 이미지의 UIView 애니메이션이 포함되어 있습니다. 이미지를 탭하면 애니메이션이 멈 춥니 다. 이 샘플 프로젝트는 뷰 레이어의 애니메이션 레이어를 사용하여 사용자가 화면을 탭하는 순간에 애니메이션이있는 위치를 파악하는 방법을 보여줍니다.

애니메이션보기가 특정 지점에 도달했을 때 무언가를하는 코드를 원한다면 더 까다로울 수 있습니다. 보기에 CADisplayLink (각 화면을 새로 고침 할 때마다 호출 됨)를 첨부하여 애니메이션의 위치를 ​​확인하고 현재 터치 위치와 비교해야 할 수도 있습니다.

+0

샘플을 확인한 후에는 사물을 알려주지 만보기가 터치 포인트에 도달하면 신호를 보내는 것과 같은 빠른 대체음이 있습니다! 또는 애니메이션 블록으로 시작하여 내가 어떻게이 일을 할 수 있는지 알게 해줄 수 있습니다. – user3042604

관련 문제