Frage

Ich versuche, eine CALayer in einem iOS-App zu ziehen.

Sobald ich seine Position Eigenschaft zu ändern versucht es an die neue Position zu animieren und flackert die ganzen Ort:

 layer.position = CGPointMake(x, y)

Wie kann ich bewegen CALayers sofort? Ich kann meinen Kopf um die Core Animation API erscheinen.

War es hilfreich?

Lösung

Sie möchten Ihren Anruf in der folgenden einzuwickeln:

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

Andere Tipps

Swift 3 Erweiterung:

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

Verbrauch:

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

Sie können auch die Komfortfunktion nutzen

[CATransaction setDisableActions:YES] 

als auch.

. Hinweis: Achten Sie darauf, die Kommentare von Yogev Shelly lesen Fallstricke zu verstehen, die auftreten könnten,

Wie andere vorgeschlagen haben, können Sie CATransaction verwenden.
Das Problem kommt, entsteht, weil CALayer eine Standard implizite Animationsdauer von 0,25 Sekunden hat.

So wird eine einfache (meiner Meinung nach) Alternative zu setDisableActions ist setAnimationDuration mit einem Wert von 0.0 zu verwenden.

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

Die Kombination von früheren Antworten hier für Swift 4, deutlich die Animationsdauer explizit zu machen ...

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

Verwendung ...

CALayer.perform(withDuration: 0.0) {
            aLayer.frame = aFrame
        }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top