2010-07-13 2 views
36

내 UI의 버튼을 분리하기 위해 아래 두 가지 방법을 연결했지만 "VERSION 1"버튼을 누른 후에 메소드 내의 애니메이션 지속 시간이 끝날 때까지 버튼을 다시 누를 수 없다는 것을 알았습니다. 제 이해는 애니메이션이 자체 응용 프로그램을 차단하지 않도록 자체 스레드를 사용한다는 것입니다.animateWithDuration : animations : 메인 스레드 차단?

// VERSION 1 
-(IBAction)fadeUsingBlock { 
    NSLog(@"V1: Clicked ..."); 
    [myLabel setAlpha:1.0]; 
    [UIView animateWithDuration:1.5 animations:^{ 
     [myLabel setAlpha:0.0]; 
    }]; 
} 

이전 스타일 버전 (아래)에서는 애니메이션 타이머가 끝나기 전에 버튼을 다시 누르면 단순히 타이머를 다시 시작합니다. 이 두 가지가 똑같이 작동해야합니까? 뭔가 빠졌거나 3.2와 4 사이에서 작동이 변경 되었습니까?

// VERSION 2 
-(IBAction)fadeUsingOld { 
    NSLog(@"V2: Clicked ..."); 
    [myLabel setAlpha:1.0]; 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1.5]; 
    [myLabel setAlpha:0.0]; 
    [UIView commitAnimations]; 
} 

건배 게리

답변

86

블록을 사용하여 애니메이션을 적용해도 주 스레드가 차단되지 않습니다. 기본적으로 사용자 상호 작용은 새로운 블록 호출로 기간 애니메이션을 사용할 수 없기 때문에 사용자가보고있는 동작이 기본이라고 생각합니다. 당신은 이런 식으로, (animationWithDuration:delay:options:animations:completion를 호출) UIViewAnimationOptionAllowUserInteraction를 전달하여이 메소드를 오버라이드 (override) 할 수 있습니다 의미가

-(IBAction) fadeUsingBlock { 
    NSLog(@"V1: Clicked ..."); 
    [myLabel setAlpha:1.0]; 
    [UIView animateWithDuration:1.5 
          delay:0 
         options:UIViewAnimationOptionAllowUserInteraction 
        animations:^{ 
         [myLabel setAlpha:0.0]; 
        } 
        completion:nil]; 
} 
+2

아, 나는이 문서에서 해당 옵션을 놓쳤다, 나는 그것을 볼 것이다. 많은 감사, 많이 감사하겠습니다. – fuzzygoat

+1

감사합니다. 젠장, 이건 나를 괴롭혔다. 실제로 애니메이션이 적용되는 뷰와의 상호 작용을 차단한다고 말하기 때문에 기본적으로 켜지지 않지만 실제로는 전체 UI를 차단합니다. – runmad

+0

곧 출시 예정인 iOS 5.0에서 수정 되었다면 좋지 않겠습니까?

1

는 animateWithDuration를 들면 :, 클래스 참조 스레딩에 대해 아무 말도하지 않는, 그래서 나는 확실하지 않다.

예 : beginAnimations:context: and commitAnimation:의 경우 별도의 스레드에서 실행됩니다. UIView class Reference.

보기 개체의 속성 변경 중 일부는 애니메이션, 예를 들어 프레임, 경계, 가운데 및 변형 속성 설정과 같은 애니메이션을 적용 할 수 있습니다. 애니메이션 블록에서 이러한 속성을 변경하면 현재 상태에서 새 상태로의 변경 사항이 애니메이션으로 표시됩니다. beginAnimations : context : class 메서드를 호출하여 애니메이션 블록을 시작하고 애니메이션을 적용 할 속성을 설정 한 다음 commitAnimations 클래스 메서드를 호출하여 애니메이션 블록을 종료합니다. 애니메이션은 별도의 스레드에서 실행되고 응용 프로그램이 실행 루프로 돌아올 때 시작됩니다. 다른 애니메이션 클래스 메서드를 사용하면 블록 내의 애니메이션 시작 시간, 지속 시간, 지연 및 곡선을 제어 할 수 있습니다.

관련 문제