2012-05-02 2 views
15

나는 UIView의 애니메이션 완료 핸들러의 반환 BOOL finished에 대한 생각을 주어지지하지만, 애플 UIView의 프로그래밍 가이드에 몇 가지 예제 코드를 읽고이 표시 적이 :UIView 애니메이션의 완료 핸들러에서 완료된 BOOL을 테스트해야합니까?

completion:^(BOOL finished) { 
if (finished) { 

이 필요합니까? 어쨌든 애니메이션이 끝나지 않으면 완료 블록이 실행되어서는 안됩니다. 맞습니까? 테스트가 중복 된 것처럼 보입니다.

답변

7

해당 코드 스 니펫에서 실제로 수행되는 작업은 매우 중요합니다. 애니메이션이 한 뷰에서 다른 뷰로 전환 중입니다. 첫 번째 뷰가 대체되고 현재 뷰가 표시되는 뷰를 유지하도록 부울이 설정됩니다. 부울은 완료 블록에 설정됩니다. 이 경우

[UIView transitionFromView:(displayingPrimary ? primaryView : secondaryView) 
    toView:(displayingPrimary ? secondaryView : primaryView) 
    duration:1.0 
    options:(displayingPrimary ? UIViewAnimationOptionTransitionFlipFromRight : 
       UIViewAnimationOptionTransitionFlipFromLeft) 
    completion:^(BOOL finished) { 
     if (finished) { 
      displayingPrimary = !displayingPrimary; 
     } 
}]; 

, 애니메이션 (어떤 이유) 완료 후, 의견 교환되지 않은하지 않으며, 당신이 절대적으로 displayingPrimary의 값을 플립 싶지 않아, 당신 때문에 '경우 그런 다음 자신의 신분에 대한 기록이 정확하지 않습니다. 이 경우에 finished 플래그가 선택되어있는 이유입니다.

해당 가이드의 다른 코드 샘플 중 대부분은 (전부는 아닐지라도) 플래그가 선택되지 않았 음을 알 수 있습니다. 이는 해당 사례에서 중요하지 않기 때문입니다 (예 : 첫 번째 이후 다른 애니메이션 실행 또는 변경 일부 값은 이 아니며은 애니메이션 완료에 따라 다릅니다.

+2

그래서 완료된 블럭이 실제로 완료되면 bool이 0 인 경우에도 실행될 수 있습니다. 왜 그런 일이 일어 났을까요? 그것은 "완료"블록이기 때문에 이전 블록이 실제로 완료된 경우에만 실행되지 않겠습니까? – johnbakers

+1

그 중 하나의 방법으로 새로운 애니메이션을 시작하면 새로운 애니메이션이 먼저 중단되게하는 옵션이 있습니다. 보기와 사용자 상호 작용을 허용하는 옵션도 있는데, 애니메이션을 취소 할 수있는 기회가 될 수 있습니다. –

+0

doc에 따르면 transitionFromView는 애니메이션 시작 시점에서 toView를 추가하고 애니메이션 끝에서 superView에서 fromView를 가져옵니다. 완료된 경우 fromView fromView보다 false이고 toView가 여전히 존재 함을 의미합니까? 내 경우에는 두 가지가 모두 사라진 경우를 보았습니다. –

3

네, 당신은 정말로 당신의 처리기에서 그 bool을 존중해야합니다. 사용자는 애니메이션을 시작할 수 있지만 애니메이션이 정상적으로 완료되기 전에 사용자는 다른 애니메이션을 일찍 취소합니다. 이 멍청이는 그런 경우를 당신에게 알려줍니다.

- 업데이트 - 단지 정교합니다. 화면에서 뷰를 움직이는 애니메이션을 상상해보십시오. 뷰의 이동이 완료하면 (자), 핸들러가 트리거됩니다. 사용자가 진행중인 첫 번째 애니메이션을 본질적으로 취소하는 새로운 애니메이션을 만들기 위해 다른 곳을 터치한다고 가정합니다. 제공된 bool을 사용하여이를 감지 할 수 있습니다.

+0

애니메이션을 취소해도 완료 핸들러가 계속 실행될 수 있습니다. – johnbakers

+0

누군가는 내가 이보다 더 확신하는 사람을 만났기를 바라지 만, 그렇습니다. 실행되기 전에 취소되지 않았지만 완료되기 전에 중단되었습니다. –

+0

완료 블록은 의미를 지니 며 애니메이션을 성공적으로 완료 한 후에 특정 작업을 수행해야하는 경우에만 유효성을 검사하여 사용해야합니다. 애니메이션이 어떻게되는지 상관하지 않는다면, 애니메이션이 성공적으로 완료되었는지 확인하는 것은 아무런 의미가 없습니다 ... – Lefteris

관련 문제