2015-07-08 9 views
7

Wenn Sie UIView.animateWithDuration ausführen, möchte ich im Gegensatz zum Standardwert eine benutzerdefinierte Kurve definieren: .CurveEaseInOut, .CurveEaseIn, .CurveEaseOut, .CurveLinear.Benutzerdefinierte Leichtigkeit in animateWithDuration?

Dies ist ein Beispiel Leichtigkeit, die ich UIView.animateWithDuration angewendet werden sollen:

let ease = CAMediaTimingFunction(controlPoints: Float(0.8), Float(0.0), Float(0.2), Float(1.0)) 

Ich habe versucht, mein eigenes UIViewAnimationCurve machen, aber es scheint es nur eine Int akzeptiert.

Ich kann die benutzerdefinierte Leichtigkeit auf eine Kernanimation anwenden, aber ich möchte benutzerdefinierte Beschleunigung für UIView.animateWithDuration für einfacheren und optimierten Code haben. UIView.animateWithDuration ist besser für mich, da ich keine Animationen für jede animierte Eigenschaft und einfachere Vervollständigungsroutinen definieren muss und den gesamten Animationscode in einer Funktion haben muss.

Hier ist mein nicht-funktionierenden Code so weit:

let customOptions = UIViewAnimationOptions(UInt((0 as NSNumber).integerValue << 50)) 
UIView.setAnimationCurve(UIViewAnimationCurve(rawValue: 5)!) 

UIView.animateWithDuration(2, delay: 0, options: customOptions, animations: { 
     view.layer.position = toPosition 
     view.layer.bounds.size = toSize 
     }, completion: { finished in 
      println("completion") 
}) 
+0

einen Blick auf diese Frage Nehmen Sie sehen. Die meisten der Antwort sind in objective-c, aber es gibt eine Reihe von Optionen http://stackoverflow.com/q/5161465/4114683 – TheSD

+0

Große Informationen über Timing-Funktionen. Das hilft auch sehr: http://netcetera.org/camtf-playground.html Dies sind jedoch alle für CA Animation (die verwendet werden muss, um benutzerdefinierte Kurven zu machen). OP wollte diese Kurven zu einem UIView-Animationsblock hinzufügen. –

+0

Bis jetzt klingt es wie meine Antwort ist NEIN. –

Antwort

4

Das ist, weil UIViewAnimationCurve eine Aufzählung ist - seine im Allgemeinen für Menschen lesbaren Darstellungen von ganzzahligen Werten verwendet, um zu bestimmen, welche Kurve zu verwenden.

Wenn Sie eine eigene Kurve definieren möchten, müssen Sie CA-Animationen verwenden.

Sie können weiterhin Abschlussblöcke und Gruppen von Animationen erstellen. Sie können Gruppe mehr CA Animationen in ein CAAnimationGroup

let theAnimations = CAAnimationGroup() 
theAnimations.animations = [positionAnimation, someOtherAnimation] 

Zur Vervollständigung, eine CATransaction verwenden.

CATransaction.begin() 
CATransaction.setCompletionBlock {() -> Void in 
    // something? 
} 
// your animations go here 
CATransaction.commit() 
+0

Chris hat Recht. Sie können keine benutzerdefinierten Beschleunigungskurven mit 'UIView'-Animationsmethoden in der' animateWithDuration'-Familie verwenden. (Zumindest nicht ohne Tricks, wenn Sie die CAAnimation modifizieren, die erstellt wird.) Die Kernanimation ist viel mächtiger und viel komplizierter zu benutzen als die UIView-Animation. –

+0

Wenn ich eine Folgeanimation habe, ist es am besten, diese Animation in den setCompletionBlock zu legen? Und wenn eine dritte Animation, dann eine andere Animation in that setCompletionBlock? 3-Schritt-Animation wird für mich sehr üblich sein, jeder mit Vorfreude und Überschwingen. –

+0

Ehrlich gesagt, würde ich vermeiden, Completion-Blöcke für so etwas zu verwenden, nur weil es für keinen zusätzlichen Vorteil chaotisch ist. Wenn Sie das Timing der Animation kennen, würde ich sagen, setzen Sie Ihre 'beginTime' für jede Animation entsprechend. Etwas wie: 'myAnimation.beginTime = 1' Wie Duncan sagte, ist es viel mächtiger und flexibler.Außerdem, wenn Sie einige allgemeine Animationen in Ihrer App haben, können Sie sie in einer Kategorie einrichten und haben einen kurzen Zugriff wie: 'myLayer.addAnimation (CABasicAnimation.addOpacityAnimationWithDuration (1), forKey:" Opazität ")' –

Verwandte Themen