Mam problem z zrozumieniem, dlaczego animacja nie działa zgodnie z oczekiwaniami. Co robie to:CAKeyFrameAnimation nie Liniowy dla wartości większych niż PI
Tworzenie
UIBezierPath
z łuku przenieść etykiety wzdłuż tej drogi i animowanie udar ścieżkach.//Start Point is -.pi /2 to let the Arc start at the top. //self.progress = Value between 0.0 and 1.0 let path : UIBezierPath = UIBezierPath.init(arcCenter: CGPoint.init(x: self.bounds.width * 0.5, y: self.bounds.height * 0.5), radius: self.bounds.width * 0.5, startAngle: -.pi/2, endAngle: (2 * self.progress * .pi) - (.pi/2), clockwise: true) return path
Dodaj tę ścieżkę do
CAShapeLayer
circlePathLayer.frame = bounds circlePathLayer.path = self.path.cgPath circlePathLayer.strokeStart = 0 circlePathLayer.strokeEnd = 1
Animowanie własności strokeEnd z
CABasicAnimation
let animation = CABasicAnimation(keyPath: "strokeEnd") animation.repeatCount = HUGE animation.fromValue = 0.0 animation.toValue = 1.0 animation.duration = self.animationDuration animation.isRemovedOnCompletion = false animation.fillMode = kCAFillModeBoth
Animowanie własności pozycja mojej wytwórni z
CAKeyFrameAnimation
let animationScore = CAKeyframeAnimation(keyPath: "position") //some things I tried to fix //animationScore.timingFunctions = [CAMediaTimingFunction(controlPoints: 0.250, 0.250, 0.750, 0.750)] //animationScore.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionLinear) animationScore.path = self.path.cgPath animationScore.duration = self.animationDuration animationScore.isRemovedOnCompletion = false animationScore.fillMode = kCAFillModeBoth animationScore.repeatCount = HUGE
Dodaj moje animacje do warstwy i oznakować
self.circlePathLayer.add(animation, forKey: nil) self.scoreLabel.layer.add(animationScore, forKey: nil)
mój problem: Dla ProgressValues większych niż 0,75 mojej wytwórni nie porusza się prędkością liniową. Wartości większe niż 0,75 oznaczają, że mój łuk jest większy niż PI. Dla wartości mniejszych niż 0,75 moja animacja działa bez zarzutu, a etykieta i obrys mają tę samą prędkość i znajdują się jeden na drugim.
proszę ignorować 100% na etykiecie w tym gif moje postępy przy wartości 0,76.
Moja etykieta spowalnia po trzech czwartych mojego okręgu.
Mam nadzieję, że ktoś może mi pomóc. Wielkie dzięki
Czy wyślesz wersję demo? Jeśli nie masz nic przeciwko? Sprawdzę to i wrócę do ciebie z rozwiązaniem –
Nie widzę, żebyś ustawiał "calculode". Ale w każdym razie ... Dlaczego w ogóle korzystasz z animacji klatek kluczowych? Po prostu obróć etykietę wokół środka okręgu jako punktu zakotwiczenia, jak planeta. Pomyśl o zegarowej ręce (pamiętasz zegary z rękami?). Będziesz potrzebował drugiego obrotu wokół centrum etykiet, aby utrzymać go w pozycji pionowej. – matt
Dziękuję wam za odpowiedzi. @matt ustawienie 'calculationMode' niczego nie zmieniło. Ale obracanie mojej etykiety wokół anchorPoint wydaje się warte wypróbowania. Jak to zrobić? Czy to po prostu "CABasicAnimation transform.rotation"? I musiałbym stworzyć "CAAnimationGroup", aby połączyć obie animacje, prawda? –