Die Form ist zu Beginn korrekt ausgefüllt, aber ich kann nicht herausfinden, wie man die Füllfarbe ändert oder, noch besser, wie man eine Füllfarbenänderung an einem UIBezierPath
animiert. Genauso wie ich die Hintergrundfarbe einer UIView ändere.Wie animiert man eine Füllfarbenänderung auf UIBezierPath?
var fillColor = UIColor()
func changeBackgroundColor() {
let animcolor = CABasicAnimation(keyPath: "fillColor")
animcolor.fromValue = UIColor.greenColor()
animcolor.toValue = UIColor.orangeColor()
animcolor.duration = 1.0;
animcolor.repeatCount = 0;
animcolor.autoreverses = true
shapeLayer.addAnimation(animcolor, forKey: "fillColor")
}
var fillColor = UIColor()
let clipPath = UIBezierPath()
let shapeLayer = CAShapeLayer()
override func drawRect(rect: CGRect) {
clipPath.moveToPoint(CGPointMake(self.bounds.minX + 7.65, self.bounds.minY - 0.25))
clipPath.addCurveToPoint(CGPointMake(self.bounds.minX + 7.65, self.bounds.minY + 36.1), controlPoint1: CGPointMake(self.bounds.minX - 2.38, self.bounds.minY + 9.79), controlPoint2: CGPointMake(self.bounds.minX - 2.38, self.bounds.minY + 26.06))
clipPath.addCurveToPoint(CGPointMake(self.bounds.minX + 43.99, self.bounds.minY + 36.1), controlPoint1: CGPointMake(self.bounds.minX + 17.69, self.bounds.minY + 46.13), controlPoint2: CGPointMake(self.bounds.minX + 33.96, self.bounds.minY + 46.13))
clipPath.addLineToPoint(CGPointMake(self.bounds.minX + 43.99, self.bounds.minY + 36.1))
clipPath.addLineToPoint(CGPointMake(self.bounds.minX + 44.01, self.bounds.minY + 0.19))
clipPath.addLineToPoint(CGPointMake(self.bounds.minX + 7.58, self.bounds.minY + 0.19))
clipPath.usesEvenOddFillRule = true
fillColor = userColor
}
clipPath.addClip()
fillColor.setFill()
clipPath.fill()
shapeLayer.path = clipPath.CGPath
self.layer.mask = shapeLayer
Das ist genial. Danke, dass Sie das zu einer besseren Umsetzung beigetragen haben. Allerdings kann ich die Füllfarbe von 'fillLayer' nicht animieren, ich kann es nicht einmal ändern. Die Funktion wird definitiv aufgerufen, ich logge sie ein, um sicherzugehen. Dies ist die Art von Sache, wo ich mich hinsetze und denke, dass ich es in 30-40 Minuten auskurbeln werde und es dauert den halben Tag. –
@spacemonkey Wird der 'fillLayer' vor dem Animieren auf dem Bildschirm angezeigt? Stellen Sie sicher, dass "frame" nicht null ist und dass es der Ebenenhierarchie hinzugefügt wird. Wenn Sie meinen obigen Code verwenden, müssen Sie die 'UIView' mit dem' init (frame:) 'Initialisierer initialisieren (in der Realität würden Sie Code mit beliebiger Größe an einen geeigneteren Ort wie' 'verschieben layoutSubviews' zum Beispiel). – Hamish
Oh, es ist da. Genau wo und wie groß es sein sollte. Die Füllfarbe wird auf das eingestellt, was sie auch sein soll, sie wird einfach nicht zu etwas anderem wechseln. –