Apakah mungkin untuk membatalkan UIView
animasi saat sedang berlangsung? Atau apakah saya harus turun ke level CA?
yaitu saya telah melakukan sesuatu seperti ini (mungkin juga menetapkan tindakan akhir animasi):
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:duration];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties
// set view properties
[UIView commitAnimations];
Tetapi sebelum animasi selesai dan saya mendapatkan acara animasi berakhir, saya ingin membatalkannya (potong pendek). Apakah ini mungkin? Googling sekitar menemukan beberapa orang mengajukan pertanyaan yang sama tanpa jawaban - dan satu atau dua orang berspekulasi bahwa itu tidak dapat dilakukan.
ios
core-animation
uiviewanimation
philsquared
sumber
sumber
Jawaban:
Cara saya melakukannya adalah membuat animasi baru ke titik akhir Anda. Tetapkan durasi yang sangat singkat dan pastikan Anda menggunakan
+setAnimationBeginsFromCurrentState:
metode ini untuk memulai dari kondisi saat ini. Ketika Anda mengaturnya ke YA, animasi saat ini dipotong pendek. Terlihat seperti ini:sumber
setAnimationBeginsFromCurrentState:
tidak disarankan dari iOS 4 tetapi masih ada dan harus tetap berfungsi.Menggunakan:
sumber
Cara termudah untuk menghentikan semua animasi pada tampilan tertentu, segera , adalah ini:
Tautkan proyek ke QuartzCore.framework. Di awal kode Anda:
Sekarang, ketika Anda ingin menghentikan semua animasi pada tampilan mati di trek mereka, katakan ini:
Garis tengah akan bekerja dengan sendirinya, tetapi ada penundaan sampai runloop selesai ("redraw moment"). Untuk mencegah penundaan itu, bungkus perintah dalam blok transaksi eksplisit seperti yang ditunjukkan. Ini berfungsi asalkan tidak ada perubahan lain yang dilakukan pada lapisan ini di runloop saat ini.
sumber
removeAllAnimations
akan memiliki efek samping membawa animasi ke bingkai terakhirnya, daripada menghentikannya di tempat sekarang.Di iOS 4 dan lebih tinggi, gunakan
UIViewAnimationOptionBeginFromCurrentState
opsi pada animasi kedua untuk memotong pendek animasi pertama.Sebagai contoh, anggap Anda memiliki tampilan dengan indikator aktivitas. Anda ingin memudar dalam indikator aktivitas sementara beberapa aktivitas yang berpotensi memakan waktu dimulai, dan memudar ketika aktivitas selesai. Dalam kode di bawah ini, tampilan dengan indikator aktivitas di dalamnya disebut
activityView
.sumber
Untuk membatalkan animasi, Anda hanya perlu mengatur properti yang saat ini sedang animasi, di luar animasi UIView. Itu akan menghentikan animasi di mana pun berada, dan UIView akan melompat ke pengaturan yang baru saja Anda tetapkan.
sumber
-animationDidStop:finished:context:
. Jika[finished boolValue] == NO
, maka Anda tahu bahwa animasi Anda entah bagaimana dibatalkan.Maaf untuk menghidupkan kembali jawaban ini, tetapi di iOS 10 hal agak berubah, dan sekarang pembatalan dimungkinkan dan Anda bahkan dapat membatalkan dengan anggun!
Setelah iOS 10, Anda dapat membatalkan animasi dengan UIViewPropertyAnimator !
Jika Anda lulus benar itu membatalkan animasi dan berhenti tepat di tempat Anda membatalkannya. Metode penyelesaian tidak akan dipanggil. Namun, jika Anda salah, Anda bertanggung jawab untuk menyelesaikan animasi:
Anda dapat menyelesaikan animasi dan tetap dalam kondisi saat ini (.current) atau pergi ke status awal (.start) atau ke status akhir (.end)
Omong-omong, Anda bahkan dapat menjeda dan memulai kembali nanti ...
Catatan: Jika Anda tidak ingin membatalkan secara tiba-tiba, Anda dapat membalikkan animasi atau bahkan mengubah animasi setelah Anda menjeda!
sumber
Jika Anda menjiwai batasan dengan mengubah konstanta alih-alih properti tampilan, tidak ada metode lain yang berfungsi di iOS 8.
Contoh animasi:
Larutan:
Anda harus menghapus animasi dari lapisan tampilan apa pun yang dipengaruhi oleh perubahan kendala dan sublapisannya.
sumber
self.constraintView.layer.removeAllAnimations()
berfungsi (Swift)Jika Anda hanya ingin menjeda / menghentikan animasi dengan lancar
Sumber: Cara menjeda animasi pohon lapisan
sumber
Tidak ada satu pun di atas yang menyelesaikannya untuk saya, tetapi ini membantu:
UIView
Animasi mengatur properti segera, lalu menjiwainya. Ini menghentikan animasi ketika lapisan presentasi cocok dengan model (properti yang ditetapkan).Saya memecahkan masalah saya, yaitu "Saya ingin menghidupkan dari tempat Anda terlihat seperti Anda muncul" ('Anda' artinya melihat). Jika Anda menginginkannya, maka:
CALayer * pLayer = theView.layer.presentationLayer;
atur posisi ke lapisan presentasi
Saya menggunakan beberapa opsi termasuk
UIViewAnimationOptionOverrideInheritedDuration
Tetapi karena dokumentasi Apple tidak jelas, saya tidak tahu apakah itu benar-benar mengesampingkan animasi lain saat digunakan, atau hanya menyetel ulang pengatur waktu.
Dan itu harus menjadi solusi yang layak untuk saat ini.
sumber
sumber
Versi cepat dari solusi Stephen Darlington
sumber
Saya memiliki masalah yang sama; API tidak memiliki apa pun untuk membatalkan beberapa animasi tertentu. Itu
+ (void)setAnimationsEnabled:(BOOL)enabled
menonaktifkan SEMUA animasi, dan karenanya tidak berfungsi untuk saya. Ada dua solusi:
1) menjadikan objek animasi Anda subview. Kemudian, ketika Anda ingin membatalkan animasi untuk tampilan itu, hapus tampilan atau sembunyikan. Sangat sederhana, tetapi Anda harus membuat ulang subview tanpa animasi jika Anda perlu melihatnya.
2) ulangi anim hanya satu, dan buat pemilih yang ditunjuk untuk memulai kembali anim jika perlu, seperti ini:
Masalah dengan 2) adalah selalu ada penundaan untuk menghentikan anim saat menyelesaikan siklus animasi saat ini.
Semoga ini membantu.
sumber
Bahkan jika Anda membatalkan animasi dengan cara di atas animasi
didStopSelector
masih berjalan. Jadi, jika Anda memiliki status logika dalam aplikasi Anda didorong oleh animasi, Anda akan memiliki masalah. Untuk alasan ini dengan cara yang dijelaskan di atas saya menggunakan variabel konteksUIView
animasi. Jika Anda melewati keadaan saat ini dari program Anda oleh param konteks ke animasi, ketika animasi berhentididStopSelector
fungsi Anda dapat memutuskan apakah itu harus melakukan sesuatu atau hanya kembali berdasarkan pada keadaan saat ini dan nilai keadaan diteruskan sebagai konteks.sumber
sumber
Untuk menjeda animasi tanpa mengembalikan status ke aslinya atau terakhir:
sumber
Ketika saya bekerja dengan
UIStackView
animasi, selain ituremoveAllAnimations()
saya perlu mengatur beberapa nilai ke yang awal karenaremoveAllAnimations()
dapat mengaturnya ke keadaan tidak terduga. Saya milikistackView
denganview1
danview2
di dalam, dan satu tampilan harus terlihat dan satu tersembunyi:sumber
Tak satu pun dari solusi yang dijawab bekerja untuk saya. Saya memecahkan masalah saya dengan cara ini (saya tidak tahu apakah itu cara yang benar?), Karena saya punya masalah ketika memanggil ini terlalu cepat (ketika animasi sebelumnya belum selesai). Saya melewati animasi yang saya inginkan dengan blok customAnim .
sumber