2013-12-17 13 views
10

Come impostare la curva di animazione quando si utilizza l'animazione fotogramma chiave del UIView:come impostare la curva di animazione quando si utilizza l'animazione di fotogrammi chiave in ios?

animateKeyframesWithDuration:delay:options:animations:completion: 

Qualsiasi cosa faccia nel blocco di animazione sembra essere lineare (a meno che non si utilizza l'opzione UIViewKeyframeAnimationOptionCalculationModeCubic ma questo non è quello che voglio).

Mi piacerebbe avere una facilità fuori curva l'animazione come l'opzione UIViewAnimationOptionCurveEaseOut quando si utilizza l'animazione normale:

animateWithDuration:delay:options:animations:completion: 

risposta

3

Se si sta utilizzando fotogrammi chiave, è necessario definire la curva da soli .. se aggiungi fotogrammi chiave lineari, hai un'animazione lineare. Se aggiungi fotogrammi chiave non lineari, avrai un'animazione non lineare.

Il frameStartTime è tuo amico qui ... sarà sempre lineare tra i fotogrammi chiave (o stimolato/cubica/cubica ritmo, come definito nel UIViewKeyframeAnimationOptionCalculationMode)

UIViewKeyframeAnimationOptionCalculationModeLinear  = 0 << 9, 
UIViewKeyframeAnimationOptionCalculationModeDiscrete = 1 << 9, 
UIViewKeyframeAnimationOptionCalculationModePaced  = 2 << 9, 
UIViewKeyframeAnimationOptionCalculationModeCubic  = 3 << 9, 
UIViewKeyframeAnimationOptionCalculationModeCubicPaced = 4 << 9 

Per calcolare i valori di temporizzazione corretti, si potrebbe utilizzalo come riferimento: RBBEasingFunction

Es. EaseInOutQuad come questo (dove t è il tempo relativo all'interno del animazione):

if (t < 0.5) { 
    return 2 * t * t; 
} else { 
    return -1 + (4 - 2 * t) * t; 
} 
14

In realtà, è possibile utilizzare le stesse bandiere della curva che si utilizza per animateWithDuration: ritardo: per mangiare: animazioni: completamento :. Solo "binari" o "dentro" con le altre opzioni nella chiamata a animateKeyframesWithDuration: ritardo: opzioni: animazioni: completamento:

La documentazione è confusa, ma funziona.

La curva valori che si possono utilizzare sono:

UIViewAnimationOptionCurveEaseInOut = 0 << 16, 
UIViewAnimationOptionCurveEaseIn = 1 << 16, 
UIViewAnimationOptionCurveEaseOut = 2 << 16, 
UIViewAnimationOptionCurveLinear = 3 << 16, 

La curva di animazione di default che si ottiene è 0, o la facilità-in, la facilità-out.

+1

Works 100% corretto. – orkenstein

+2

Fantastico! funziona bene. Molto strano questo non è nella documentazione, specialmente perché hanno un valore non lineare come predefinito ... –

+0

Bene, dopo aver provato tutte le opzioni di KeyFrame sono tornato a questo, che è quello che dovevo iniziare. Dà un avvertimento ma funziona perfettamente :) – Fogmeister

15

Swift 2.0 non consente la trasmissione di UIViewAnimationOptions come UIViewKeyframeAnimationOptions. Non consentirà inoltre di aggiungere | insieme.

Tuttavia, esiste un inizializzatore per UIViewKeyframeAnimationOptions che accetta uno rawValue. Così, il seguente codice funziona per mettere in UIViewAnimationOptionsUIViewKeyframeAnimationOptions:

let animationOptions: UIViewAnimationOptions = .CurveEaseOut 
let keyframeAnimationOptions: UIViewKeyframeAnimationOptions = UIViewKeyframeAnimationOptions(rawValue: animationOptions.rawValue) 

poi posso passare keyframeAnimationOptions-animateKeyframesWithDuration e tutto funziona alla grande.

+0

Buon punto su Swift. (votato) –

+2

Grazie a Dio questo funziona! Grazie! –

+1

Come posso aumentare l'effetto '.CurveEaseOut'? Grazie, bella risposta! –

7

Ecco una soluzione Swift bello e pulito mi si avvicinò con:

extension UIViewKeyframeAnimationOptions { 

    init(animationOptions: UIViewAnimationOptions) { 
     rawValue = animationOptions.rawValue 
    } 

} 

Usage:

UIViewKeyframeAnimationOptions(animationOptions: .CurveEaseOut) 
0

La risposta da @eskimwier non ha funzionato per me quando si cerca di impostare la curva a linear per animateKeyframes(withDuration:delay:options:animations:completion:).Questo era in Swift 3, Xcode 8.2.1.

La mia animazione sembrava essere impostata su easeInOut (avvio lento, più veloce nel mezzo, lento alla fine). Apple ha cambiato la curva predefinita?

In ogni caso, ho voluto una curva lineare, e ha cercato l'approccio qui suggerito di utilizzare UIViewAnimationOptions con le animazioni dei fotogrammi chiave:

let animationOptions: UIViewAnimationOptions = .curveLinear 
var keyframeAnimationOptions: UIViewKeyframeAnimationOptions = UIViewKeyframeAnimationOptions(rawValue: animationOptions.rawValue) 

UIView.animateKeyframes(withDuration: 3, delay: 0, options: [keyframeAnimationOptions], animations: { 
    //... animations here ... 
}, completion: nil) 

Questo non ha avuto effetto. L'unica cosa che ha funzionato per me è stata fare prima di chiamare animateKeyframes:

UIView.setAnimationCurve(UIViewAnimationCurve.linear) 
Problemi correlati