2016-08-18 9 views
7

समस्या
मैं एक विस्फोटक छल्ले प्रभाव बना रहा हूं, के बीच एनिमेट करते समय अजीब व्यवहार। मैं एकाधिक CAShapeLayer के उपयोग कर रहा हूं और प्रत्येक परत के लिए UIBezierPath बना रहा हूं। जब दृश्य प्रारंभ किया जाता है, तो सभी परतों में चौड़ाई 0 के साथ पथ होता है। जब कोई क्रिया ट्रिगर होती है, तो अंगूठियां एक बड़े पथ को एनिमेट करती हैं।दो परिपत्र UIBezierPaths

जैसा कि नीचे डेमो में देखा गया है, प्रत्येक परत का दायां हाथ किनारा प्रत्येक परिपत्र परत के शेष से एनिमेट करने के लिए धीमा है।

डेमो
Video

कोड

आकर्षित परतों:

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 ... 

} 

उत्तर

3

0 की पथ चौड़ाई से शुरू होने से बचें। 0 से स्केल करना बहुत मुश्किल है और छोटी फ्लोटिंग-पॉइंट त्रुटियां बढ़ती हैं। शून्य के बहुत करीब के मान फ़्लोटिंग पॉइंट में बहुत निरंतर नहीं हैं (हमम .... मुझे लगता है कि वास्तव में वास्तविक ब्रह्मांड की तरह थोड़ा है)। बड़े मूल्यों से शुरू करने का प्रयास करें और देखें कि शून्य के करीब आप सुरक्षित रूप से कैसे जा सकते हैं।

+0

चौड़ाई के आरंभिक मान को 0 के बजाय 1 में सेट करना यह हल हो गया है, आपकी मदद के लिए धन्यवाद! – Ollie

संबंधित मुद्दे