2014-10-09 3 views
0

버튼을 누를 때까지 애니메이션을 실행해야하는 앱을 만들려고합니다. 내가 무한 루프를 사용하려고했지만 그 루프 내 애플 리케이션이 전혀 실행되지 않습니다. 그것은 모든 기억을 소비하고 있습니다. 나는 또한 완료시 동일한 함수를 다시 호출하려고 시도했지만 그 프로세스는 또한 CPU의 100 %를 소비합니다.버튼을 누를 때까지 애니메이션 실행

내가 여기서해야 할 일을 안내해 주실 수 있습니까?

시나리오는 배경의 배경과 비슷하지만 버튼을 누를 때까지 애니메이션이 계속 실행되어야합니다. 버튼을 누를 때 다른보기가 열리고 다른 버튼을 누를 때까지 또 다른 애니메이션이 계속 실행됩니다. 다음 내 코드입니다 :

func unlimitedLoop() 
    { 

     rotating = true 

     self.ProcurementSupport.transform = CGAffineTransformMakeTranslation(0, 100) 
     self.ProcurementSupport.hidden = false 



     UIView.animateWithDuration(3, delay: 2, usingSpringWithDamping: 2, initialSpringVelocity: 2, options: nil, animations: { 
      // self.EquipmentSupport.hidden = true 

      var x:NSTimeInterval = 2 



       springWithDelay(2, x, { 
        self.ProcurementSupport.transform = CGAffineTransformMakeTranslation(0,0) 
        self.EquipmentSupport.transform = CGAffineTransformMakeTranslation(1000,0) 
        x=x+2 
       }) 

       springWithDelay(2, x, { 
        self.EquipmentSupport.transform = CGAffineTransformMakeTranslation(0,100) 
        x=x+2 
       }) 

       springWithDelay(2, x, { 
        self.ProcurementSupport.transform = CGAffineTransformMakeTranslation(1000,0) 
        self.EquipmentSupport.transform = CGAffineTransformMakeTranslation(0,0) 
        x=x+2 
       }) 
       springWithDelay(2, x, { 
        self.ProcurementSupport.transform = CGAffineTransformMakeTranslation(0, 100) 
        x=x+2 
       }) 



      }, completion: {finished in self.unlimitedLoopAgain()}) 


    } 

답변

0

별도의 스레드에서이 기능을 실행하는 데 필요한 무한 루프를 생성하여 사용자 정의 애니메이션을하고. 루프 자체 옆에 모든 프레임의 작은 시간 동안 스레드를 중지하는 것이 가장 좋습니다 (예 : 약 60FPS를 얻기 위해 1.0/60.0에 대해 sleep을 호출). 이 접근법에서 또 다른 문제점은 새 스레드가 뷰 시스템의 매개 변수를 변경할 때 주 스레드에서 콜백하여 "뷰가 필요한 설정"을 새로 고칠 가능성이 높다는 것입니다. 어떤 경우에도 그런 함수를 만들어야하고 그 안에 당신이했던 것처럼 애니메이션을 호출해야한다. 직접 애니메이션을 할 필요가있다.

더 나은 방법은 일반적으로 어떤 종류의 타이머 또는 디스플레이 링크를 사용하는 것입니다. 이 항목은 디스플레이가 다시 그리기 될 때마다 트리거되므로 애니메이션에 적합합니다. 이 호출은 가장 일반적으로 이미 메인 스레드에 있으므로 다른 것을 필요로하지 않습니다. 애니메이션을 다시 호출하는 것은 피해야합니다.

또 다른 방법은 종류의 재귀를 사용하는 것입니다. 애니메이션을 업데이트 할 때마다 예를 들어 약간의 지연 시간 (1.0/60.0) 후에 같은 업데이트 방법을 호출합니다 ...

어쨌든 무한 루프는 계속 실행되고 모든 프로세서 성능을 사용하지만 다른 방법은 실행되지 않습니다. 그래서 당신은 전혀 결과를 볼 수 없습니다. 시스템이 프레임 사이에 다른 메소드 (업데이트 호출)를 수행하도록하는 방법이 필요하므로 업데이트가 완료된 후 일정 기간 동안 실행이 중지되거나 별도의 스레드에 배치됩니다. 이 두 가지 방법 모두 메인 쓰레드가 다른 것들도 할 수있게 해준다.

관련 문제