2015-05-10 11 views
6

Non riesco a rimuovere l'animazione dalla proprietà strokeEnd del mio CAShapeLayer.Posso modificare una proprietà strokeEnd senza animazione?

La documentazione dice che la proprietà è animatable ma non è animata di default e non riesco a individuare il problema. Qualche suggerimento dove cercare?

Ecco il mio codice:

class ViewController: UIViewController { 

    let circle = CAShapeLayer() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Circle 
     circle.fillColor = UIColor.clearColor().CGColor 
     circle.strokeColor = UIColor.blackColor().CGColor 
     circle.lineWidth = 10 
     circle.strokeEnd = 0 
     circle.lineJoin = kCALineJoinRound 
     circle.path = UIBezierPath(ovalInRect: CGRectMake(60, 140, 200, 200)).CGPath 
     circle.actions = ["strokeEnd" : NSNull()] 

     // Show Button 
     let showButton = UIButton(frame: CGRectMake(40, 40, 240, 40)) 
     showButton.addTarget(self, action: "showButton", forControlEvents: UIControlEvents.TouchUpInside) 
     showButton.setTitle("Show circle", forState: UIControlState.Normal) 
     showButton.backgroundColor = UIColor.greenColor() 

     // Add to view 
     self.view.layer.insertSublayer(circle, atIndex: 1) 
     self.view.addSubview(showButton) 
    } 

    func showButton() { 
     circle.strokeEnd = 1 
    } 
} 

CAShapeLayer strokeEnd animation

+0

Qual è il punto di 'circle.actions = [" strokeEnd ": NSNull()]'? – idmean

+0

Apparentemente il CAShapeLayer ha azioni predefinite (animazioni) per le sue proprietà .. – Tieme

+0

- Rimossa la soluzione dalla domanda e l'ha aggiunta alla risposta di seguito .. – Tieme

risposta

14

L'approccio si descrive di impostare l'azione strokeEnd del livello per NSNull funziona, ma è un po 'di una mazza. Quando lo fai, uccidi l'animazione implicita della proprietà strokeEnd del tuo layer per sempre.

Se è quello che vuoi, va bene. Comunque, io preferisco usare il secondo approccio che David Rönnqvist elenca nella risposta che hai collegato: Rendere il tuo cambiamento di livello all'interno di un blocco di inizio/commit di CATransaction. Ecco il codice per questo dalla risposta di David (che è eccellente, come lo sono sempre i suoi post).

[CATransaction begin]; 
[CATransaction setDisableActions:YES]; 
// change your property here 
yourShapeLayer.strokeEnd = 0.7; 
[CATransaction commit]; // animations are disabled until here... 

Questo codice è in Objective-C. La traduzione in Swift non è poi così male:

CATransaction.begin() 
CATransaction.setDisableActions(true) 
yourShapeLayer.strokeEnd = 0.7 
CATransaction.commit() 
+0

Sì, hai ragione. Grazie. – Tieme

+0

@Tieme, dovresti accettare la tua risposta o la mia, in modo che altri lettori sappiano che hai trovato una soluzione. –

+0

Scusa, ieri ero un po 'occupato. – Tieme

Problemi correlati