Saya memutar CALayer dan mencoba menghentikannya pada posisi terakhir setelah animasi selesai.
Tetapi setelah animasi selesai, pengaturan ulang ke posisi awal.
(xcode docs secara eksplisit mengatakan bahwa animasi tidak akan memperbarui nilai properti.)
ada saran bagaimana mencapai ini.
ios
iphone
calayer
cabasicanimation
Nilesh Ukey
sumber
sumber
.presentation()
untuk mendapatkan nilai "akhir, terlihat". Cari ke bawah untuk jawaban yang benar di bawah ini yang menjelaskan hal itu dilakukan dengan lapisan presentasi.Jawaban:
Inilah jawabannya, kombinasi dari jawaban saya dan jawaban Krishnan.
Nilai standarnya adalah
kCAFillModeRemoved
. (Yang merupakan perilaku reset yang Anda lihat.)sumber
Masalah dengan penghapusan OnCompletion adalah elemen UI tidak memungkinkan interaksi pengguna.
Teknik I adalah mengatur nilai FROM dalam animasi dan nilai TO pada objek. Animasi akan secara otomatis mengisi nilai TO sebelum dimulai, dan ketika dihapus akan meninggalkan objek pada keadaan yang benar.
sumber
alphaAnimation.beginTime = 1;
Juga,fillMode
tidak diperlukan sejauh yang saya tahu ...?beginTime
ini tidak relatif, Anda harus menggunakan misalnya:CACurrentMediaTime()+1;
fillMode
, lihat lebih banyak di Mencegah Lapisan Dari Memotret Kembali ke Nilai Asli Saat Menggunakan CAfanimasi EksplisitSetel properti berikut:
sumber
masukkan saja ke dalam kode Anda
sumber
Anda bisa mengatur kunci
CABasicAnimation
untukposition
ketika Anda menambahkannya ke layer. Dengan melakukan ini, itu akan menimpa animasi implisit yang dilakukan pada posisi untuk operan saat ini di run loop.Anda dapat memiliki informasi lebih lanjut tentang Sesi Video Apple WWDC 2011 421 - Core Animation Essentials (tengah video)
sumber
someLayer.position = endPosition;
. Dan terima kasih atas referensi ke WWDC!CALayer memiliki lapisan model dan lapisan presentasi. Selama animasi, lapisan presentasi diperbarui secara terpisah dari model. Ketika animasi selesai, lapisan presentasi diperbarui dengan nilai dari model. Jika Anda ingin menghindari lompatan yang menggelegar setelah animasi berakhir, kuncinya adalah menjaga kedua lapisan tetap sinkron.
Jika Anda tahu nilai akhirnya, Anda bisa langsung mengatur modelnya.
Tetapi jika Anda memiliki animasi di mana Anda tidak tahu posisi akhir (misalnya memudar lambat bahwa pengguna dapat menghentikan sementara dan kemudian membalikkan), maka Anda dapat meminta lapisan presentasi langsung untuk menemukan nilai saat ini, dan kemudian memperbarui model.
Menarik nilai dari lapisan presentasi juga sangat berguna untuk penskalaan atau keypath rotasi. (misalnya
transform.scale
,transform.rotation
)sumber
Tanpa menggunakan
removedOnCompletion
Anda dapat mencoba teknik ini:
sumber
Jadi masalah saya adalah saya mencoba memutar objek pada gerakan pan dan jadi saya memiliki beberapa animasi yang identik pada setiap gerakan. Saya memiliki keduanya
fillMode = kCAFillModeForwards
danisRemovedOnCompletion = false
tetapi itu tidak membantu. Dalam kasus saya, saya harus memastikan bahwa kunci animasi berbeda setiap kali saya menambahkan animasi baru :sumber
Pengaturan sederhana
fillMode
danremovedOnCompletion
tidak berhasil untuk saya. Saya memecahkan masalah dengan mengatur semua properti di bawah ini ke objek CABasicAnimation:Kode ini berubah
myView
menjadi 85% dari ukurannya (dimensi 3 tidak berubah).sumber
Animasi inti mempertahankan dua hierarki lapisan: lapisan model dan lapisan presentasi . Ketika animasi sedang berlangsung, lapisan model sebenarnya utuh dan menyimpannya nilai awal. Secara default, animasi dihapus setelah selesai. Kemudian lapisan presentasi jatuh kembali ke nilai lapisan model.
Cukup mengatur
removedOnCompletion
keNO
sarana animasi tidak akan dihapus dan memori limbah. Selain itu, lapisan model dan lapisan presentasi tidak akan lagi sinkron, yang dapat menyebabkan potensi bug.Jadi itu akan menjadi solusi yang lebih baik untuk memperbarui properti secara langsung pada lapisan model ke nilai akhir.
Jika ada animasi tersirat yang disebabkan oleh baris pertama kode di atas, coba matikan jika:
sumber
Ini bekerja:
Animasi inti menunjukkan 'lapisan presentasi' di atas lapisan normal Anda selama animasi. Jadi atur opacity (atau apa pun) ke apa yang ingin Anda lihat ketika animasi selesai dan lapisan presentasi hilang. Lakukan ini di telepon sebelum Anda menambahkan animasi untuk menghindari kedipan ketika selesai.
Jika Anda ingin menunda, lakukan hal berikut:
Akhirnya, jika Anda menggunakan 'RemoveOnCompletion = false' itu akan membocorkan CAAnimations sampai lapisan akhirnya dibuang - hindari.
sumber
@Leslie Godwin tidak benar-benar baik, "self.view.layer.opacity = 1;" dilakukan segera (dibutuhkan sekitar satu detik), harap perbaiki alphaAnimation.duration hingga 10.0, jika Anda ragu. Anda harus menghapus baris ini.
Jadi, ketika Anda memperbaiki fillMode ke kCAFillModeForwards dan dihapusOnCompletion menjadi TIDAK, Anda membiarkan animasi tetap berada di layer. Jika Anda memperbaiki delegasi animasi dan mencoba sesuatu seperti:
... layer mengembalikan segera pada saat Anda mengeksekusi baris ini. Itu yang ingin kami hindari.
Anda harus memperbaiki properti layer sebelum menghapus animasi dari itu. Coba ini:
sumber
Tampaknya flag yang dihapus OnCompletion diatur ke false dan fillMode diatur ke kCAFillModeForwards juga tidak bekerja untuk saya.
Setelah saya menerapkan animasi baru pada layer, objek animating me-reset ke keadaan awal dan kemudian menjiwai dari keadaan itu. Apa yang harus dilakukan tambahan adalah untuk mengatur properti lapisan model yang diinginkan sesuai dengan properti lapisan presentasinya sebelum mengatur animasi baru seperti:
sumber
Solusi termudah adalah menggunakan animasi tersirat. Ini akan menangani semua masalah itu untuk Anda:
Jika Anda ingin menyesuaikan misalnya durasinya, Anda dapat menggunakan
NSAnimationContext
:Catatan: Ini hanya diuji pada MacOS.
Awalnya saya tidak melihat animasi apa pun ketika melakukan ini. Masalahnya adalah bahwa lapisan lapisan yang didukung tampilan tidak tersirat bernyawa. Untuk mengatasi ini, pastikan Anda menambahkan layer sendiri (sebelum mengatur tampilan ke layer-didukung).
Contoh cara melakukan ini adalah:
Menggunakan
self.wantsLayer
tidak membuat perbedaan dalam pengujian saya, tetapi bisa memiliki beberapa efek samping yang saya tidak tahu.sumber
Berikut ini contoh dari taman bermain:
false
keisRemovedOnCompletion
- biarkan Core Animation bersih setelah animasi selesaisumber