Zeichnung eines Kreises animieren
Ich bin auf der Suche nach einer Möglichkeit zum animieren der Zeichnung eines Kreises. Ich war in der Lage, erstellen Sie den Kreis, aber es zieht alles zusammen.
Hier ist mein CircleView
Klasse:
import UIKit
class CircleView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = UIColor.clearColor()
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func drawRect(rect: CGRect) {
//Get the Graphics Context
var context = UIGraphicsGetCurrentContext();
//Set the circle outerline-width
CGContextSetLineWidth(context, 5.0);
//Set the circle outerline-colour
UIColor.redColor().set()
//Create Circle
CGContextAddArc(context, (frame.size.width)/2, frame.size.height/2, (frame.size.width - 10)/2, 0.0, CGFloat(M_PI * 2.0), 1)
//Draw
CGContextStrokePath(context);
}
}
Und hier ist, wie ich es in der view-Hierarchie, die in meinem view-controller:
func addCircleView() {
let diceRoll = CGFloat(Int(arc4random_uniform(7))*50)
var circleWidth = CGFloat(200)
var circleHeight = circleWidth
//Create a new CircleView
var circleView = CircleView(frame: CGRectMake(diceRoll, 0, circleWidth, circleHeight))
view.addSubview(circleView)
}
Gibt es eine Möglichkeit zum animieren der Zeichnung des Kreises über 1 Sekunde?
Beispiel, Teil Weise durch die animation würde es Aussehen wie die Blaue Linie in diesem Bild:
InformationsquelleAutor der Frage Roi Mulia | 2014-10-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der einfachste Weg dies zu tun ist, um die Leistung des core-animation zu tun, die meiste Arbeit für Sie. Das zu tun, müssen wir, um zu bewegen, Ihren Kreis zeichnen-code von Ihrem
drawRect
- Funktion, um eineCAShapeLayer
. Dann können wir eineCABasicAnimation
zu animierenCAShapeLayer
'sstrokeEnd
Eigenschaft von0.0
zu1.0
.strokeEnd
ist ein großer Teil der Magie hier; von den docs:Wenn wir
strokeEnd
zu0.0
es wird nicht alles zeichnen. Wenn wir es zu1.0
es zeichne einen Kreis. Wenn wir es zu0.5
es zeichne einen Halbkreis. etc.So, um zu beginnen, ermöglicht das erstellen einer
CAShapeLayer
in IhremCircleView
'sinit
- Funktion und hinzufügen, dass die Schicht zu der Ansichtsublayers
(auch sicher sein, entfernen Sie diedrawRect
Funktion, da die Schicht wird die Zeichnung der Kreis jetzt):Hinweis: Wir setzen
circleLayer.strokeEnd = 0.0
so, dass der Kreis nicht gezeichnet sofort.Nun fügen wir eine Funktion, die wir aufrufen können, um die trigger-animation Kreis:
Dann, alles, was wir tun müssen, ist zu ändern Sie Ihre
addCircleView
- Funktion, so dass es auslöst, wenn die animation, die Sie hinzufügen, dieCircleView
seinersuperview
:All das zusammen sollte in etwa so Aussehen:
Hinweis: Es nicht wiederholen werde, wie, dass, wird es bleiben, ein Kreis, nachdem er animiert wird.
InformationsquelleAutor der Antwort Mike S
Mikes Antwort aktualisiert für Swift 3.0
Aufruf der Funktion:
InformationsquelleAutor der Antwort Mick
Mike ' s Antwort ist Super!!! Ein weiteres nettes und einfache Möglichkeit, es zu tun ist, verwenden Sie drawRect kombiniert mit setNeedsDisplay(). Es scheint laggy, aber seiner nicht 🙂
Wollen wir einen Kreis zeichnen, ausgehend von der Spitze, die -90° und endet bei 270°. Der Mitte des Kreises ist (centerX, centerY), mit einem bestimmten radius. CurrentAngle ist der aktuelle Winkel der Endpunkt des Kreises, die von minAngle (-90) zu maxAngle (270).
In drawRect, die wir angeben, wie der Kreis soll anzeigen :
Das problem ist, dass gerade jetzt, als currentAngle ist nicht zu ändern, der Kreis ist statisch, und nicht einmal zeigen, wie currentAngle = minAngle.
Erstellen wir einen timer und wenn der timer feuert, erhöhen wir currentAngle. An der Spitze Ihrer Klasse fügen Sie das timing zwischen zwei feuern :
In Ihrer init, fügen Sie den timer :
Können wir die Funktion, die aufgerufen wird, wenn der timer feuert :
Leider beim ausführen der app, wird nichts angezeigt, weil wir nicht angeben, das system, sollte es wieder zu zeichnen. Dies geschieht durch Aufruf von setNeedsDisplay(). Hier ist die aktualisierte timer-Funktion :
_
_
_
Alle der code, den Sie benötigen, summiert sich hier :
Möchten Sie die Geschwindigkeit ändern, ändern Sie einfach die updateTimer-Funktion, oder die rate, mit der diese Funktion aufgerufen wird. Auch, möchten Sie vielleicht, um die Unwirksamkeit der timer sobald der Kreis vollständig ist, die ich vergaß zu tun 🙂
NB: fügen Sie den Kreis in Ihrem storyboard, nur eine Ansicht hinzufügen, wählen Sie es aus, gehen zu seinen Identity Inspectorund als Klassegeben Sie CircleClosing.
Prost! bRo
InformationsquelleAutor der Antwort bRo
Wenn Sie wollen einen Abschluss-handler, dies ist eine andere Lösung, ähnlich der von Mike S, getan Swift 3.0
Mit der Fertigstellung handler, können Sie die animation wieder, entweder durch den rekursiven Aufruf der gleichen Funktion für die animation wieder (das wird nicht sehr schön Aussehen), oder Sie können eine umgekehrte Funktion, die kontinuierlich Kette, bis eine Bedingung erfüllt ist, zum Beispiel:
Damit es noch schicker mag, Sie können ändern Sie die Richtung der animation wie diese:
InformationsquelleAutor der Antwort tdon