2017-09-25 1 views
1

Ich entwickle iOS-Anwendung in Swift und ich möchte ein Bild in 360 Grad mit Bewegung drehen. Die Animation sollte für 2 Sekunden gestoppt werden, sobald sie jede Runde beendet hat.Quick Image Rotation 360 Grad

Ich brauche 2 Sekunden Verzögerung nach Abschluss jeder Umdrehung. Wie kann ich eine Verzögerung einstellen? Ich habe einen Bildrotationsalgorithmus gemacht.

func rotate360Degrees(_ duration: CFTimeInterval = 1.0, completionDelegate: CAAnimationDelegate? = nil) { 
    let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation") 
    rotateAnimation.fromValue = 0.0 
    rotateAnimation.toValue = CGFloat(M_PI * 2.0) 
    rotateAnimation.duration = duration 

    if let delegate: CAAnimationDelegate = completionDelegate { 
     rotateAnimation.delegate = delegate 

    } 
    rotateAnimation.repeatCount = Float.greatestFiniteMagnitude; 

    self.layer.add(rotateAnimation, forKey: nil) 
} 

Für Verzögerung Ich habe dies versucht:

let deadlineTime = DispatchTime.now() + .seconds(2) 
    DispatchQueue.main.asyncAfter(deadline: deadlineTime, execute: { 
     self.imgView.rotate360Degrees() 
    }) 

es funktioniert nicht.

+0

Was funktioniert nicht? Sie rufen nicht 'rotate360Degrees' auf, oder diese Methode verursacht keine Rotation? Oder Rotation funktioniert, aber es gibt keine Pause zwischen den Rotationen? (meine beste Vermutung: die letzte, und die richtige Antwort beinhaltet 'CAKeyframeAnimation', da das, was Sie tun, eine Verzögerung beim Starten einer Animation irgendwie erwartet, sich permanent in die Animation zu setzen) – Tommy

+0

Rotation funktioniert, aber ich brauche 2 Sekunden Verzögerung Bei jeder Umdrehung funktioniert dieser Teil nicht. – user12346

Antwort

0

Es ist sehr einfach. Rufen Sie einfach Ihre Funktion in einem Körper auf und sobald die Rotation beendet ist, rufen Sie die gleiche Funktion nach 2 Sekunden Verzögerung auf. Und wann immer Sie aufhören wollen, hören Sie auf, es zu entfernen. Beispiel

unowned let unownedSelf = self 

let deadlineTime = DispatchTime.now() + .seconds(2) 
DispatchQueue.main.asyncAfter(deadline: deadlineTime, execute: { 
unownedSelf.functionToCall() 
}) 
+0

Ich habe wie dieser versucht, lassen deadlineTime = DispatchTime.now() + .seconds (2) DispatchQueue.main.asyncAfter (Frist: deadlineTime, ausführen: { var Affine = CGAffineTransform (Rotation: 0,0) Affine = affineTransform.rotated (von: CGFloat (M_PI)) lassen Sie circlePath = UIBezierPath (arcCenter: CGPoint (x: 100 - (100/2), y: 100 - (100/2)), Radius: CGFloat (100), startAngle: CGFloat (0), endAngle: CGFloat (M_PI * 2), im Uhrzeigersinn: wahr) orbit.rotationMode = kCAAnimationRotateAuto }) aber es funktioniert nicht – user12346

+0

Das Problem ist, dass Sie die Funktion aufrufen müssen, nachdem Sie die Drehung zum Beispiel es dauert 30 Sekunden, um die Drehung zu beenden, als nach 32 Sekunden aufzurufen. Stellen Sie sicher, dass Sie beim erstmaligen Aufrufen dieser Funktion genügend Zeit haben, um vor dem nächsten Zyklus zu pausieren. Es ist jetzt mehr Management-Sache .. Sie sind fast da. Ansonsten lassen Sie mich wissen, dass ich meinen Code für mehr Verständnis aktualisieren kann. – cole

+0

Ich habe es aber gemacht, als ich diese Funktion wieder in einem Stück Code anrief, den du mir zur Verfügung gestellt hast. Animation sieht nicht glatt aus. Es ist unordentlich. – user12346