2014-11-10 22 views
6

ho questa forma che ho disegnare in drawRect()Animare un tracciato Bezier disegnato in drawRect() Swift

var rectanglePath = UIBezierPath() 

override func drawRect(rect: CGRect) { 
    rectanglePath = UIBezierPath(rect: self.bounds) 
    rectanglePath.fillWithBlendMode(kCGBlendModeMultiply, alpha: 0.7) 
    layer.shouldRasterize = true 
} 

Quando viene chiamata la funzione prepareForEditing, voglio animare la rectanglePath. Ho provato

func prepareForEditing(editing:Bool){ 
     UIView.animateWithDuration(0.5, 
      animations: { 
       self.rectanglePath = makeNewShape() 
      } 
     ) 
    } 

Non succede nulla. Puoi dirmi cosa c'è di sbagliato nel mio codice?

risposta

8

Per animare CGPath non è possibile utilizzare i metodi UIView.animation. ho creato UIView sottoclasse personalizzata per mostrare come è possibile animare la forma CGPaths, si prega di fare riferimento ai commenti e lo modifica per le tue esigenze:

class MyView: UIView { 

let shapeLayer = CAShapeLayer() 
let maskLayer = CAShapeLayer() 
var rectanglePath = UIBezierPath() 

override func didMoveToSuperview() { 
    super.didMoveToSuperview() 

    backgroundColor = UIColor.clear 

    // initial shape of the view 
    rectanglePath = UIBezierPath(rect: bounds) 

    // Create initial shape of the view 
    shapeLayer.path = rectanglePath.cgPath 
    shapeLayer.strokeColor = UIColor.black.cgColor 
    shapeLayer.fillColor = UIColor.clear.cgColor 
    layer.addSublayer(shapeLayer) 

    //mask layer 
    maskLayer.path = shapeLayer.path 
    maskLayer.position = shapeLayer.position 
    layer.mask = maskLayer 
} 

func prepareForEditing(editing:Bool){ 

    let animation = CABasicAnimation(keyPath: "path") 
    animation.duration = 2 

    // Your new shape here 
    animation.toValue = UIBezierPath(ovalIn: bounds).cgPath 
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) 

    // The next two line preserves the final shape of animation, 
    // if you remove it the shape will return to the original shape after the animation finished 
    animation.fillMode = kCAFillModeForwards 
    animation.isRemovedOnCompletion = false 

    shapeLayer.add(animation, forKey: nil) 
    maskLayer.add(animation, forKey: nil) 
    } 
} 
+0

Grazie tra l'altro! La modalità 'fillWithBlend' funziona con ShapeLayers? L'ho provato in questo modo e la fusione non ha funzionato affatto. –

+0

Credo che se si aggiunge la funzione drawRect alla classe MyView (esattamente com'è con 3 linee di codice che si hanno) tutto dovrebbe essere come si desidera. – Greg

+0

Perché hai disegnato la forma in 'didMoveToSuperview()' e non in 'drawRect()' –