2016-05-26 5 views
0

nehmen viel von diesen hier Fragen Zeichnung: Problems animating a countdown in swift sprite kit und Animating circular progress View in SwiftKreisfortschrittsanzeige in iOS

jedoch die Beispiele oben (und alle anderen Beispiele, die ich online gefunden habe) zeigen die Fortschrittsanzeige mit einem Satz Animieren Dauer. Meine animiert den Download-Fortschritt eines UIImage in eine UITableView-Zelle. Hier ist mein Code soweit. In meiner UITableViewCell Unterklasse, ich habe dies:

func drawProgress(toValue: Float) { 
    let circlePath = UIBezierPath(arcCenter: CGPoint(x: self.contentView.frame.width/2, y: self.contentView.frame.height/2), radius: 30, startAngle: 0, endAngle: 6.28, clockwise: true) 
    // create its cooresponding layer 
    let circleLayer = CAShapeLayer() 
    circleLayer.frame = self.contentView.bounds 
    circleLayer.path = circlePath.CGPath 
    circleLayer.strokeColor = UIColor.blackColor().CGColor 
    circleLayer.fillColor = self.contentView.backgroundColor?.CGColor 
    circleLayer.lineWidth = 1.0 
    self.contentView.layer.addSublayer(circleLayer) 

    // create the animation 
    let pathAnimation = CABasicAnimation(keyPath: "strokeEnd") 
    pathAnimation.duration = 0.1 
    pathAnimation.fromValue = NSNumber(float: 0.0) 
    pathAnimation.toValue = NSNumber(float: toValue) 

    // apply the animation to path 
    circleLayer.addAnimation(pathAnimation, forKey: "strokeEnd") 
} 

I NSURLSessionDownloadDelegate bin mit dem Download-Fortschritt der NSData zu überwachen. Innerhalb dieser Methode erhalte ich alle notwendigen Informationen, um den Download% zu verfolgen. Hier ist mein Code dort:

func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) { 

    //...other code above to get the correct cell for index path, etc 
    myCell.drawProgress(toValue:download.progress) 
    //trackCell.progressView.progress = download.progress 
} 

Die kommentierte out line:

//myCell.progressView.progress = download.progress 

ist ein UIProgressBar. Diese UIProgressBar meldet und zeigt in der Zelle den korrekten Fortschritt jedes Mal an, also weiß ich, dass ich alle notwendigen Informationen habe, und die Info ist richtig, so ist es nur etwas darüber, wie ich das implementiere, um es nicht zu arbeiten. Derzeit, wenn ich die TableView lade, kann ich sehen, dass die ersten paar Zellen die Animation wirklich schnell (schneller als der eigentliche Download) zeichnen, und wenn ich dann die Tabelle herunterscrolle, sind alle Fortschrittsbalken bereits voll Ich sehe keine Animation in ihnen.

Ich weiß, dass download.progress den richtigen Float enthält, der den Download-Prozess verfolgt. Wie kann ich diesen CAShapeLayer für jede Zelle richtig animieren lassen?

dank

Antwort

0
var progressCircle = CAShapeLayer() 

// computed property - set() property observer updates circle when passed new progress value 
var progress: CGFloat { 
    get { 
     return progressCircle.strokeEnd 
    } 
    set { 
     if (newValue >= 1) { 
      progressCircle.strokeEnd = 1 
     } else if (newValue < 0) { 
      progressCircle.strokeEnd = 0 
     } else { 
      progressCircle.strokeEnd = newValue 
     } 
    } 
} 

nutzen - setzen Sie Ihren Fortschritt Kreis Objekt

func createProgressCircle() { 
    let rotationTransform = CATransform3DRotate(CATransform3DIdentity, CGFloat(-M_PI_2), 0, 0, 1.0) 

    // you can either create a rect for the circle now programmatically 
    //or pass in the frame of an existing storyboard object to draw within 
    let rectForCircle = CGRect(origin: CGPoint(myView.origin), size: CGSize(width: myView.width, height: myView.height)) 
    progressCircle.path = circlePath(inRect: rectForCircle).cgPath 

    progressCircle.lineWidth = 4.0 
    progressCircle.fillColor = UIColor.clear.cgColor 
    progressCircle.strokeColor = sitchRed.cgColor 
    progressCircle.transform = rotationTransform 
    circleShapeView.layer.addSublayer(progressCircle) 
    circleShapeView.backgroundColor = UIColor.clear // make sure the circleView is clear so underlayer circle shape can show through 
    progress = 0.0 
} 

Um Fortschritte Änderungen zu zeigen, übergeben Sie den aktuellen Fortschritt Wert der Download in den Fortschritt Eigentum in Ihrem Viewcontroller auf, und Der Beobachter der set() -Eigenschaft aktualisiert die aktuelle Strichposition des Kreises :)