Gerade saß ich an dem Problem, einen typischen Refresh-Button zu erstellen, der sich nach dem Aktivieren so lange dreht, wie die Aktion im Gang ist. Meinen Lösungsansatz dazu möchte ich euch hier nicht vorenthalten.
Als erstes erstellen wir uns hierzu eine kleine Extension für UIView, welche die Rotation übernimmt und auch wieder stoppen kann.
Wir nennen sie am besten UIViewExtension.swift mit folgendem Inhalt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import UIKit extension UIView { func rotateStart(duration: CFTimeInterval = 1.0) { let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation") rotateAnimation.fromValue = 0.0 rotateAnimation.toValue = CGFloat(M_PI * 2.0) rotateAnimation.duration = duration rotateAnimation.fillMode = kCAFillModeForwards rotateAnimation.removedOnCompletion = false rotateAnimation.cumulative = true rotateAnimation.repeatCount = Float.infinity self.layer.addAnimation(rotateAnimation, forKey: "rotate") } func rotateStop() { self.layer.removeAnimationForKey("rotate") } } |
Die Methode rotateStart erstellt eine Animation, welche die View um 360° dreht und die endlos fortgeführt wird. In rotateStop wird diese Animation dann manuell wieder entfernt. Ohne die beiden Zuweisungen removedOnCompletion=false und cumulative=true sowie das setzen von repeatCount auf Float.infinity (entspricht HUGE_VALF) würde die Animation nach der Ausführung automatisch beendet und entfernt.
In unserem ViewController definieren wir nun das Bild:
1 |
let refreshIndicator = UIImageView(image: UIImage(named: "refresh")) |
Beim Klicken auf den Button tauschen wir diesen nun gegen die ImageView aus und starten die Animation:
1 2 |
self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(customView: self.refreshIndicator), animated: false) self.refreshIndicator.rotateStart() |
Damit unser ursprünglicher Button nicht verlorengeht, sollte wir die normalerweise schwache Referenz (weak) im IBOutlet „stärken“:
1 2 |
// @IBOutlet » weak « var buttonRefresh: UIBarButtonItem! @IBOutlet var buttonRefresh: UIBarButtonItem! |
Nach Abschluss der Aktion können wir die Animation nun beenden und den Button wieder herstellen:
1 2 |
self.navigationItem.setLeftBarButtonItem(self.buttonRefresh, animated: false) self.refreshIndicator.rotateStop() |
Viel Spaß beim Rotieren!