0

일반적인 UIView 클래스 메서드를 사용하여 몇 가지 물건에 애니메이션을 적용하려고합니다. 인기있는 iCarousel 라이브러리에서 호출하는 메서드에서 이러한 애니메이션 메서드를 호출합니다. 캐 러셀을 스크롤하면 애니메이션이 즉시 완료 상태가되어 완료 기능을 호출합니다 (애니메이션의 지속 시간 무시). finished BOOL이 true이므로 애니메이션이 중단 된 것처럼 보이지 않습니다.코어 애니메이션 완료 함수가 바로 호출됩니다.

iCarousel의 위임 메서드 외부에서 이러한 애니메이션을 트리거하면 작동합니다. 나는 iCarousel을 고치려고하지 않으며, 뭔가 잘못되었다고 생각하지도 않습니다. 좀 더 궁금해서 코드 내부에서 내 애니메이션이 즉시 완료 될 수 있습니다. 그리고 내가 그 문제를 피하기 위해 할 수있는 일.
iCarousel의 문서는 애니메이션과 일부 충돌을 방지하기 위해 회전 목마의 useDisplayLink 속성을 변경할 수 있습니다 언급 :

- (void)carouselCurrentItemIndexDidChange:(iCarousel *)carousel { 
    [UIView 
    animateWithDuration:5.0f 
    delay:0 
    options: 
     UIViewAnimationOptionCurveEaseOut | 
     UIViewAnimationOptionOverrideInheritedDuration | 
     UIViewAnimationOptionOverrideInheritedCurve 
    animations:^{ 
     myView.alpha = 0; 
    } 
    completion:^(BOOL finished){ 
     NSLog(@"Completed. Did it finish? %i", finished); 
    }]; 
} 

마지막 세부 :

다음은 예입니다. 이것은 어떤 차이도없는 것처럼 보입니다.

미리 도움을 청하십시오!

답변

2

iCarousel의 소스에서 문제를 발견했습니다. 라이브러리 내에서 어떤 이유로 든 [CATransaction setDisableActions:YES];을 사용하여 애니메이션을 사용 중지 한 다음 나중에 여러 위치에서 다시 사용하도록 설정합니다. 그런 장소 중 하나가 내 애니메이션이 제대로 실행되는 것을 방해하는 콜백 묶음에 걸쳐 있습니다.

iCarousel 코드로 판단하면 이는 매우 의도적 인 것이므로 본인의 코드에서이 문제를 해결해야 할 것입니다.

편집 : 여기에이 문제를 피할 수 내 업데이트 된 코드는 다음과 같습니다

- (void)carouselDidEndScrollingAnimation:(iCarousel *)carousel { 
    BOOL previousDisableActions = [CATransaction disableActions]; 
    [CATransaction setDisableActions:NO]; 

    // Begin animation here. 

    [CATransaction setDisableActions:previousDisableActions]; 
} 

업데이트 : iCarousel의 저자는 내부적으로 나는 각 대표 전화 주변에 위에 제시 한 코드를 추가하여이 버그를 수정했다. 이게 좋은쪽으로 고쳐진 것 같아.