2013-03-25 2 views
2

앱에 버튼이 두 개 있고 각각 애니메이션 (예 : 푸시 또는 기타 표준 세그 또는 맞춤 애니메이션)을 시작한다고 가정 해보십시오. 사용자가 "한 번에"두 버튼을 동시에 누르면 두 애니메이션이 동시에 발생하지 않도록 어떻게합니까? 글쎄, 처음 시도 :사용자 입력에 응답하여 하나의 작업 만 실행되도록하려면 어떻게해야합니까?

[[viewController view] setUserInteractionEnabled:NO]; 

그러나 이것은 문제를 해결하지 못합니다. (어쩌면 userInteractionEnabled 즉시 파단에 계단식되지 않는 이유는 무엇입니까?) 나는 노력 그리고

: 문제를 해결 않습니다

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

, 제외 당신이 (다른 후, 매우 빨리 하나를 두 버튼을 누르면 기본적으로 두 손가락을 사용하여 두 버튼을 동시에 누르십시오.) 그러면 두 애니메이션이 모두 발생하여 내 앱에 문제가 발생합니다. 어쩌면 두 이벤트가 내 코드가 실행되기 전에 이미 실행되었습니다 -beginIgnoringInteractionEvents이 호출됩니까?

다른 탭 이벤트를 즉시 중지하는 신뢰할 수있는 방법은 무엇입니까? 또는 이미 시작한 것들을 버리십시오. 내 모든 응용 프로그램에이 문제가 - 두 개의 단추 (또는 두드리기 테이블 셀 등) 매우 빠르게 두 이벤트를 트리거하고 애니메이션 엉망이.

아이디어가 있으십니까? iOS 앱에서이 문제에 대해 사람들이 무엇을합니까?

+0

isAnimating과 같은 속성을 추가하고 버튼을 누르고 애니메이션 전에 상태를 확인하지 않는 이유는 무엇입니까? –

+0

버튼을 클릭 할 때 애니메이션이 있으면 애니메이션이 발견되고 그 애니메이션을 멈추고 새 애니메이션을 시작합니다. – Balu

+0

답장을 보내 주셔서 감사합니다.하지만 표준 푸시/팝 등을 포함한 앱 전반에 걸쳐 많은 애니메이션이 있습니다. 따라서 전 세계의 isAnimating 속성을 보유해야하며 모든 표준 분야에서 설정해야합니다! (애니메이션이 완료되면 설정이 해제되어야하므로 수행하기가 어렵습니다). 더 좋은 방법이있을거야? – Bbx

답변

1

터치 처리는 iOS에서 비동기 적으로 수행되어 장치가 응답하는지 확인합니다. 즉, 처리기가 실행되기 전에 대기열에 올라있을 수 있으므로 beginIgnoringInteractionEvents에 대한 호출이 무시되는 이유입니다.

가장 쉬운 방법은 단순히 상호 작용을 독점적으로 만들기 위해 전역 변수를 만드는 것입니다.

@interface UIApplicaiton(AnimationsInProgress) 

- (BOOL)isAnimationInProgress; 
- (void)setAnimationInProgress:(BOOL)value; 

@end 

및 구현 :

@implementation UIApplication(AnimationsInProgress) 
{ 
    BOOL _isAnimationInProgress; 
} 

- (BOOL)isAnimationInProgress { 
    return _isAnimationInProgress; 
} 

- (void)setAnimationInProgress:(BOOL)value { 
    _isAnimationInProgress = value; 
} 

는 애니메이션 작업의 상단에, 거의 당신이 beginIgnoringInteractionEvents을 것처럼 사용

if ([[UIApplication sharedApplication] isAnimationInProgress) 
    return; 
[[UIApplication sharedApplication] setAnimationInProgress:YES]; 

[UIView animate .... completion:^{ 
    [[UIApplication sharedApplication] setAnimationInProgress:NO]; 
}]; 

와 같은 더 경쟁 조건이 없기 때문에 터치 이벤트 및 beginIgnoringInteractionEvents,이 목적을 위해 작동합니다.

+0

확인해 주셔서 감사합니다. 하지만 표준 iOS가 어떻게 될 것인가. 나는 prepareForSegue를 가로 챌 수 있고 setAnimationInProgress를 호출 할 수 있다고 생각하지만, segue가 완료되었을 때 나는 쉽게 생각할 수있는 쉽고 안정적인 방법이 없다. – Bbx

+0

+1하지만 전체 앱에서 직접이 작업을 수행하는 것은 광기입니다. – zoul

+0

segues의 경우, 뷰 컨트롤러 자체에서이를 추적하고,'prepareForSegue'에서 state boolean을 설정하고'viewDidAppear'에서 재설정하십시오. –

관련 문제