2017-12-04 1 views
2

현재 애니메이션 기능 자체가 끝나기 전에 애니메이션 기능의 완료가 끝나는 문제가 있습니다.Swift - 애니메이션이 완료되기 전에 완료됩니다.

배열 progressBar[]은 복수 UIProgressViews을 포함합니다. 애니메이션이 끝나면 다음 애니메이션이 시작되기를 원합니다. 하지만 지금은 모두 즉시 시작됩니다.
어떻게 해결할 수 있습니까?

@objc func updateProgress() { 

     if self.index < self.images.count { 
      progressBar[index].setProgress(0.01, animated: false) 
      group.enter() 

      DispatchQueue.main.async { 
       UIView.animate(withDuration: 5, delay: 0.0, options: .curveLinear, animations: { 
        self.progressBar[self.index].setProgress(1.0, animated: true) 
       }, completion: { (finished: Bool) in 
        if finished == true { 
         self.group.leave() 
        } 
       }) 
      } 
      group.notify(queue: .main) { 
       self.index += 1 
       self.updateProgress() 
      } 
     } 
    } 
+1

내가 생각 group.notify (큐 : .main)는 { self.index + = 1 self.updateProgress() }이 통화가 완료 핸들러 내부해야하지? – Suresh

+1

아니요. 문제는 아닙니다. group.notify (queue : .main) {self.index + = 1 self.updateProgress()} 호출되고 잘 작동하지만 내 문제는 UIProgressView 애니메이션 끝내기 전에 이미 호출 된 것입니다. –

답변

3

문제는 UIView.animate()는 애니메이션 특성에 사용될 수 있으며, progress는 애니메이션 특성이 아니다. 여기에서 "Animatable"은 "Core Animation에서 외부 애니메이션 가능"을 의미합니다. UIProgressView은 내부 애니메이션을 수행하며 외부 애니메이션과 충돌합니다. 이것은 다소 지나치게 똑똑한 UIProgressView이지만 해결할 수 있습니다.

UIProgressView은 Core Animation을 사용하므로 CATransaction 완성 블록이 실행됩니다. 그러나 현재의 UIView 애니메이션의 지속 기간을 존중하므로 혼동 스럽기는하지만 현재 CATransaction의 기간을 존중하지는 않습니다. 나는 둘 다 어떻게 사실인지 확신 할 수 없다. (나는 UIView 애니메이션 지속 시간이 트랜잭션에서 구현 될 것이라고 생각한다.)하지만 사실 인 것처럼 보인다.

감안할 방법은 다음과 같습니다을하려고하는 일을하는 것을 : (시작/커밋)

func updateProgress() { 
    if self.index < self.images.count { 
     progressBar[index].setProgress(0.01, animated: false) 

     CATransaction.begin() 
     CATransaction.setCompletionBlock { 
      self.index += 1 
      self.updateProgress() 
     } 
     UIView.animate(withDuration: 5, delay: 0, options: .curveLinear, 
         animations: { 
         self.progressBar[self.index].setProgress(1.0, animated: true) 
     }) 
     CATransaction.commit() 
    } 
} 

내가 여기에 중첩 된 트랜잭션을 만드는거야 그냥 경우 다른 완료 블록이있다 이 거래 중에 생성 된 그럴 가능성은 희박하며 코드는 begin/commit을 호출하지 않고 "작동"하지만이 방법은 기본 트랜잭션을 망치는 것보다 약간 안전합니다.

+0

모든 것이 작동하지만 첫 번째 UIProgressView가 작동합니다. 처음에는 쇼가 아니며 애니메이션이 다른 방법보다 빠릅니다. 해결책이 있습니까? 그러나 그것 외에 그것은 잘 작동합니다. : D –

+0

'viewDidAppear' 전에'updateProgress'를 호출하고 있습니까? 예를 들어,'viewDidLoad'에서 호출합니까? 첫 번째 애니메이션은 아직 배치되지 않았으므로 글리치가 발생합니다. (나는이 실수를 저질렀고 첫 번째 애니메이션에서 이상한 결함이 있었기 때문에 이것이 문제의 일부 버전이라고 생각합니다 ...) –

+0

UIViewController에서이 작업을 수행하지 않습니다. UICollectionViewCell 클래스에서이 작업을 수행하고 있습니다. 그래서 awakeFromNib()에서 호출하고 있습니다. 그러면 어떻게 부르겠습니까? –

관련 문제