Domanda

Sto cercando di trascinare un CALayer in un'app iOS.

Non appena modifico la proprietà position, tenta di animarsi nella nuova posizione e lampeggia ovunque:

 layer.position = CGPointMake(x, y)

Come posso spostare CALayers all'istante? Sembra che non riesca a orientarmi nell'API Core Animation.

È stato utile?

Soluzione

Desideri concludere la tua chiamata come segue:

[CATransaction begin]; 
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];

Altri suggerimenti

Estensione Swift 3:

extension CALayer {
    class func performWithoutAnimation(_ actionsWithoutAnimation: () -> Void){
        CATransaction.begin()
        CATransaction.setValue(true, forKey: kCATransactionDisableActions)
        actionsWithoutAnimation()
        CATransaction.commit()
    }
}

Utilizzo:

CALayer.performWithoutAnimation(){
    someLayer.position = newPosition
}

Puoi anche usare la funzione convenienza

[CATransaction setDisableActions:YES] 

pure.

Nota: assicurati di leggere i commenti di Yogev Shelly per comprendere eventuali problemi che potrebbero verificarsi.

Come altri hanno suggerito, puoi usare CATransaction .
Il problema sorge poiché CALayer ha una durata di animazione implicita predefinita di 0,25 secondi.

Quindi, un'alternativa più semplice (secondo me) a setDisableActions è usare setAnimationDuration con un valore di 0.0 .

[CATransaction begin];
[CATransaction setAnimationDuration:0.0];
layer.position = CGPointMake(x, y);
[CATransaction commit];

Combinando qui le risposte precedenti per Swift 4, per rendere esplicita la durata dell'animazione ...

extension CALayer
{
    class func perform(withDuration duration: Double, actions: () -> Void) {
        CATransaction.begin()
        CATransaction.setAnimationDuration(duration)
        actions()
        CATransaction.commit()
    }
}

Utilizzo ...

CALayer.perform(withDuration: 0.0) {
            aLayer.frame = aFrame
        }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top