Non solo CGPath
è opaco, ma anche CAAnimation
non supporta alcuna aggiornamenti o notifiche per le animazioni in corso (ovvero dopo iniziato ma prima finito). Le uniche entità coinvolte sono le animazioni stesse e CALayer
-s a cui è applicato.
Quindi, le opzioni sono:
(alcune opzioni possono sembrare troppo spaventoso, ma non lo sono, così ho fatto un progetto di esempio, vedi sotto)
repeatCount
Come wj2061 accennato è his answer voi può modificare l'animazione repeatCount
. Contro è che animerà 0,25 del tempo di animazione, non 0,25 di percorso
CAShapeLayer
Se, per caso, si può rappresentare il vostro segmento ticker
con CAShapeLayer
allora è possibile animare strokeStart
e strokeEnd
così sarà simile segmento si muove lungo il percorso
Clever repeatCount
È possibile calcolare quali repeatCount
valore che l'animazione si ferma a 0,25 del percorso.
- acchiappare Bezier lib
- estratto Bezier dalla funzione di temporizzazione con
getControlPointAtIndex:
- risolvere bezier per ottenere il suo "valore di progresso" (di solito chiamato
t
) per i quali il valore 'y' di bezier abbinerà al tuo "necessaria progresso" 'x' valore (0,25)
- calcolare di Bezier per quella
t
- questo è il valore esatto di repeatCount
è necessario
Anim CORTEGGIAMENTO con CAAnimation, tutto da solo
sorta di avanzata
- acchiappare i lib Bezier
- creare personalizzato sottoclasse CALayer con proprietà dinamica, diciamo proprietà sintetizzati
rideProgress
- aggiuntivi per tracciato Bezier (da Bezier lib, non CGPath) e sottolivello (per esempio,
rideLayer
) per animare
- override
needsDisplayForKey:
per rideProgress
chiave e initWithLayer:
per tutte le proprietà introdotte MA utilizzare self.rideLayer?.presentationLayer()
invece di copiare rideLayer
- ignorare uno di questi:
drawInContext:
e disegnare ciò che è necessario in esso; o (migliore) display
, in display
recuperare il valore corrente rideProgress
da presentationLayer
e aggiornare il sottolivello, quindi chiamare super. In entrambi i casi, utilizzare bezier lib per calcolare la posizione e la rotazione per sottolivello di conseguenza per valore attuale rideProgress
- non dimenticate di
CATransaction.setDisableActions(true)
prima di impostare qualsiasi proprietà animatable di qualsiasi livello
- infine, utilizzare qualsiasi tipo di CAAnimation o di animazione implicito
rideProgress
proprietà
percorso Split
Anche in questo caso, suggerito da wj2061. È possibile dividere il percorso in modo una delle due metà rappresenterà 0,25 dell'originale
Here è esempio di implementazione di tutto ciò di cui sopra tranne "percorso Split". Non ho eseguito test sul campo su questo codice, è solo un concetto funzionante. XCode 7.3.1, Swift.
Materiali utilizzati: Wiki on Cubic function, Great article about operations on beziers, Cubic equations solving method line-by-line
fonte
2016-05-20 03:33:26
Il problema con questo è che l'animazione non si fermerà a 1/4 della via attraverso il * percorso *, solo 1/4 del passaggio attraverso l'animazione * *. Pertanto con una funzione di temporizzazione 'kCAMediaTimingFunctionEaseInEaseOut' e 0,25 per' repeatCount', l'animazione si fermerà prima del previsto. Inoltre, la funzione di cronometraggio verrà comunque applicata all'intera durata dell'animazione - e quindi sembrerà accelerare e poi improvvisamente fermarsi, che può o meno essere ciò che l'OP vuole. – Hamish
@ originaluser2, sei corretto. Ho trovato che l'animazione non si fermava perfettamente dove pensavo, quindi questo lo spiega! Grazie! Sto cercando 1/4 del percorso, non l'animazione. –