2011-06-14 3 views
7

UIButton을 애니메이션화하려고합니다. 그러나 애니메이션 중에는 UIButton과 상호 작용이 없습니다. 예상되는 동작은 이동하는 동안 버튼을 클릭 할 수 있습니다. 여기에 코드있는 UIButton의 단편 애니메이션이다 :애니메이션 도중 UIButton이 상호 작용하지 않습니다.

UIImage *cloudImage = [UIImage imageNamed:@"sprite.png"];  
UIButton moveBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
[moveBtn setFrame:CGRectMake(0.0, 80.0, cloudImage.size.width, cloudImage.size.height)]; 
[moveBtn setImage:cloudImage forState:UIControlStateNormal]; 
[moveBtn addTarget:self action:@selector(hit:) forControlEvents:UIControlEventTouchUpInside]; 
[self.view addSubview:moveBtn]; 
CGPoint newLeftCenter = CGPointMake(300.0f + moveBtn.frame.size.width/2.0f, moveBtn.center.y); 
[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:5.0f]; 
[UIView setAnimationRepeatCount:HUGE_VALF]; 
moveBtn.center = newLeftCenter; 
[UIView commitAnimations]; 

hit 선택 그냥 버튼이 응답하거나하지 않을 경우 표시하려면 NSLog를 표시합니다. 어떤 도움을 주시면 감사하겠습니다.

답변

8

여기에 최근 몇 가지 질문이있었습니다. 애니메이션은 순전히 시각적입니다. 애니메이션이 완료 될 때까지 이전 프레임에서 버튼을 탭할 수 있습니다. 완료되면 실제 버튼이 점프됩니다.

편집 :

This answer 내가 언급 한 것입니다. NSTimer로 버튼을 수동으로 움직여야합니다. 자세한 내용은 연결된 질문/답변을 참조하십시오.

다른 사람들은 UIViewAnimationOptionAllowUserInteraction을 UIViewAnimation 옵션으로 전달할 것을 제안합니다.

+0

기본적으로 내 애니메이션이 왼쪽에서 오른쪽으로 진행 중이므로 애니메이션이 완료 될 때까지 기다릴 수 없습니다. 이것은 처음에는 버튼이있는 것을 막을 것입니다. 왜냐하면 그것이 동작하는 동안 버튼을 만지기 만하면되기 때문입니다. – Frank

+0

제 편집을 참조하십시오. – Moshe

+0

ah cool thx, 나는 touchBegan을 추가하고 터치되어있는 rect를 감지했다.이 버튼은 애니메이션 슬라이드 중에 클릭 할 수 있으면 멋지 겠지만 나를 위해 일하고있다. ( – Frank

24

애니메이션 옵션을 UIViewAnimationOptionAllowUserInteraction으로 설정해보십시오.

[UIView animateWithDuration:.2 
         delay: 0 
        options: UIViewAnimationOptionAllowUserInteraction 
       animations:^{ 
        // animation logic 
       } 
       completion:^(BOOL completed) { 
        // completion logic 
       } 
]; 
+1

여전히 작동하지 않는다. – Frank

+0

+ 1 나를 위해 일했습니다 . –

+1

훌륭한 작업을했습니다. 배경색을 움직여서 펄스를 발생시키는 UIButton이 있습니다.이 옵션을 추가하면 문제가 해결되었습니다. 감사합니다. – TMilligan

0

이 문제는 블록 당 큰 애니메이션이 원인입니다. 위에서 제안한 것과 같은 NSTimer 기반의 솔루션을 만들었고 작동했습니다 ... 아직 움직임이 번쩍입니다 (모든 타이머 이벤트 트리거 내에 애니메이션을 삽입하지 않은 경우).

어쨌든 애니메이션이 필요했기 때문에 타이머가 필요없는 솔루션을 발견했습니다. 짧은 거리 만 움직이면 버튼 클릭은 여전히 ​​정확합니다. 약간의 오류가 있습니다. 제 경우는 UI에서 매우 눈에 띄지 않으며 매개 변수에 따라 줄일 수 있습니다.

주어진 시간의 오류는 < 15.0이며 애니메이션 속도 요구 사항에 따라 더 정확하게 줄일 수 있습니다. 더 빠른 속도를 위해 지속 시간을 줄일 수도 있습니다.

- (void)conveyComplete:(UIView*)v 
{ 
    [self convey:v delay:0]; 
} 

- (void)convey:(UIView*)v delay:(int)nDelay 
{ 
    [UIView animateWithDuration:.5 
          delay:nDelay 
         options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction) 
        animations:^
        { 
         CGRect rPos = v.frame; 
         rPos.origin.x -= 15.0; 
         v.frame = rPos; 
        } 
        completion: ^(BOOL finished) 
        { 
         [self conveyComplete:v]; 
        }]; 

} 
+0

이동중인보기를 클릭 할 수있는 UIButtons가 포함되어 있습니다. – paiego

0

또 다른 옵션은 애니메이션을 적용하는 버튼 위에 투명 버튼을 추가하는 것입니다. 특정 경우에는 버튼을 움직일 때이 기능을 사용할 수 없지만 시작 위치에서 마지막 위치까지 덮을만큼 큰 오버레이 버튼을 만들 수 있습니다.

내 경우에는 UIViewAnimationOptionAllowUserInteraction을 사용하여 작동하지 않습니다. 맥박 효과를 만들기 위해 UIBarButtonItem (initWithCustomView로 생성됨) 내부의 UIButton의 알파에 애니메이션을 적용했는데 그 옵션이 작동하지 않습니다. 나는 NSTimer 옵션이 맘에 들지 않는다. (부드럽 지 않다), 결국 나는 오버레이 버튼을 추가했다. 나는 오버레이 버튼을 추가했는데, 싫어하지만 완벽하게 작동한다.