समस्या
मैं एक विस्फोटक छल्ले प्रभाव बना रहा हूं, के बीच एनिमेट करते समय अजीब व्यवहार। मैं एकाधिक CAShapeLayer
के उपयोग कर रहा हूं और प्रत्येक परत के लिए UIBezierPath
बना रहा हूं। जब दृश्य प्रारंभ किया जाता है, तो सभी परतों में चौड़ाई 0
के साथ पथ होता है। जब कोई क्रिया ट्रिगर होती है, तो अंगूठियां एक बड़े पथ को एनिमेट करती हैं।दो परिपत्र UIBezierPaths
जैसा कि नीचे डेमो में देखा गया है, प्रत्येक परत का दायां हाथ किनारा प्रत्येक परिपत्र परत के शेष से एनिमेट करने के लिए धीमा है।
डेमो
कोड
आकर्षित परतों:
func draw(inView view: UIView) -> CAShapeLayer {
let shapeLayer = CAShapeLayer()
// size.width defaults to 0
let circlePath = UIBezierPath(arcCenter: view.center, radius: size.width/2, startAngle: 0, endAngle: CGFloat(360.0).toRadians(), clockwise: true)
shapeLayer.path = circlePath.CGPath
shapeLayer.frame = view.frame
return shapeLayer
}
परतों को अपडेट करना
func updateAnimated(updatedOpacity: CGFloat, updatedSize: CGSize, duration: CGFloat) {
let updatePath = UIBezierPath(arcCenter: view.center, radius: updatedSize.width/2,
startAngle: 0, endAngle: CGFloat(360).toRadians(), clockwise: true)
let pathAnimation = CABasicAnimation(keyPath: "path")
pathAnimation.fromValue = layer.path // the current path (initially with width 0)
pathAnimation.toValue = updatePath.CGPath
let opacityAnimation = CABasicAnimation(keyPath: "opacity")
opacityAnimation.fromValue = self.opacity
opacityAnimation.toValue = updatedOpacity
let animationGroup = CAAnimationGroup()
animationGroup.animations = [pathAnimation, opacityAnimation]
animationGroup.duration = Double(duration)
animationGroup.fillMode = kCAFillModeForwards
animationGroup.removedOnCompletion = false
layer.addAnimation(animationGroup, forKey: "shape_update")
... update variables ...
}
चौड़ाई के आरंभिक मान को 0 के बजाय 1 में सेट करना यह हल हो गया है, आपकी मदद के लिए धन्यवाद! – Ollie