2013-05-27 4 views
1

Apple에서 아래 코드를 사용하여 애니메이션을 일시 중지했다가 다시 시작합니다.iOS에서 애니메이션 일시 중지 및 다시 시작

일시 중지 버튼을 클릭하면 애니메이션이 일시 중지 된 다음 팝업이 표시됩니다. 팝업의 재생 버튼을 클릭하면 먼저 팝업을 제거한 다음 애니메이션을 다시 시작합니다. 내가 직면 한 문제는 때로는 다시 시작하지 못한다는 것입니다. 애니메이션이 일시 중지 된 상태로 유지됩니다. 지연없이 애니메이션을 빠르게 일시 중지하고 다시 시작할 때 이런 현상이 발생합니다.

- (void)pauseAnimation:(CALayer *)layer 
{ 
    if (m_pCustomImageBtnObj != nil) 
    { 
     CFTimeInterval pausedTime = 
      [layer convertTime:CACurrentMediaTime() fromLayer:nil]; 

     layer.speed = 0.0; 
     layer.timeOffset = pausedTime; 
    } 
} 

- (void)resumeAnimation 
{ 
    if (m_pCustomImageBtnObj != nil) 
    { 
     CFTimeInterval pausedTime = [m_pCustomImageBtnObj.layer timeOffset]; 
     m_pCustomImageBtnObj.layer.speed = 1.0; 
     m_pCustomImageBtnObj.layer.timeOffset = 0.0; 
     m_pCustomImageBtnObj.layer.beginTime = 0.0; 

     CFTimeInterval timeSincePause = 
      [m_pCustomImageBtnObj.layer convertTime:CACurrentMediaTime() 
              fromLayer:nil] - pausedTime; 

     m_pCustomImageBtnObj.layer.beginTime = timeSincePause; 
    } 
} 

답변

2

애니메이션이 현재 이벤트 루프 중에 이미 다시 시작했는지 또는 일시 중지가 발생했는지 확인해야한다고 생각합니다. 이 상태를 귀하의 resumeAnimation에 추가하십시오 :

- (void)resumeAnimation 
{ 
    if (m_pCustomImageBtnObj != nil) 
    { 
     CFTimeInterval pausedTime = [m_pCustomImageBtnObj.layer timeOffset]; 
     if (pausedTime != 0) { // check if resume is called before. 
      m_pCustomImageBtnObj.layer.speed = 1.0; 
      m_pCustomImageBtnObj.layer.timeOffset = 0.0; 
      m_pCustomImageBtnObj.layer.beginTime = 0.0; 

      CFTimeInterval timeSincePause = 
      [m_pCustomImageBtnObj.layer convertTime:CACurrentMediaTime() 
              fromLayer:nil] - pausedTime; 

      m_pCustomImageBtnObj.layer.beginTime = timeSincePause; 
     } 
    } 
}