Saya mencoba memutar UIImageView
360 derajat, dan telah melihat beberapa tutorial online. Saya tidak bisa membuat mereka bekerja, tanpa UIView
berhenti, atau melompat ke posisi baru.
- Bagaimana saya bisa mencapai ini?
Hal terbaru yang saya coba adalah:
[UIView animateWithDuration:1.0
delay:0.0
options:0
animations:^{
imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
}
completion:^(BOOL finished){
NSLog(@"Done!");
}];
Tetapi jika saya menggunakan 2 * pi, itu tidak bergerak sama sekali (karena itu posisi yang sama). Jika saya mencoba melakukan hanya pi (180 derajat), itu berhasil, tetapi jika saya memanggil metode lagi, itu berputar mundur.
EDIT :
[UIView animateWithDuration:1.0
delay:0.0
options:0
animations:^{
[UIView setAnimationRepeatCount:HUGE_VALF];
[UIView setAnimationBeginsFromCurrentState:YES];
imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
}
completion:^(BOOL finished){
NSLog(@"Done!");
}];
juga tidak bekerja. Ia pergi ke 180
derajat, berhenti selama sepersekian detik, lalu kembali ke 0
derajat sebelum mulai lagi.
Kudos kepada Richard J. Ross III untuk ide itu, tetapi saya menemukan bahwa kodenya tidak cukup yang saya butuhkan. Default untuk
options
, saya percaya, adalah memberi AndaUIViewAnimationOptionCurveEaseInOut
, yang tidak terlihat benar dalam animasi berkelanjutan. Juga, saya menambahkan tanda centang sehingga saya dapat menghentikan animasi saya pada perempat putaran genap jika saya membutuhkan (bukan tak terbatas , tetapi durasi tidak terbatas ), dan membuat peningkatan akselerasi naik selama 90 derajat pertama, dan melambat selama 90 derajat terakhir (setelah berhenti diminta):Memperbarui
Saya menambahkan kemampuan untuk menangani permintaan untuk mulai berputar lagi (
startSpin
), sementara putaran sebelumnya mereda (menyelesaikan). Contoh proyek di sini di Github .sumber
M_PI / 2
dengan- (M_PI / 2)
. (Gulir kode ke kanan untuk melihat akhir setiap baris)0.5
Detik yang sama per 90 derajat, seperti saya? Jika demikian, kode saya tidak membiarkan Anda berhenti di sebagian kecil dari rotasi 90 derajat. Hal ini memungkinkan Anda untuk berhenti di seluruh interval 90 derajat, tetapi menambahkan satu rotasi 90 derajat tambahan, "mereda". Jadi, dalam kode di atas, jika Anda meneleponstopSpin
setelah 0,35 detik, itu akan berputar selama 0,65 detik lagi, dan berhenti pada rotasi total 180 derajat. Jika Anda memiliki pertanyaan yang lebih terperinci, Anda mungkin harus membuka pertanyaan baru. Silakan tautkan ke jawaban ini.Di Swift, Anda dapat menggunakan kode berikut untuk rotasi tak terbatas:
Cepat 4
Cepat 3
Berhenti seperti:
sumber
Jawaban Nate di atas sangat ideal untuk menghentikan dan memulai animasi dan memberikan kontrol yang lebih baik. Saya tertarik mengapa Anda tidak bekerja dan dia tidak. Saya ingin membagikan temuan saya di sini dan versi kode yang lebih sederhana yang akan menghidupkan UIView terus menerus tanpa berhenti.
Ini adalah kode yang saya gunakan,
Saya menggunakan 'CGAffineTransformRotate' bukan 'CGAffineTransformMakeRotation' karena yang pertama mengembalikan hasil yang disimpan sebagai hasil animasi. Ini akan mencegah lompatan atau pengaturan ulang tampilan selama animasi.
Hal lain adalah tidak menggunakan 'UIViewAnimationOptionRepeat' karena pada akhir animasi sebelum mulai berulang, itu me-reset transformasi membuat tampilan melompat kembali ke posisi semula. Alih-alih mengulang, Anda berulang sehingga transformasi tidak pernah mengatur ulang ke nilai asli karena blok animasi hampir tidak pernah berakhir.
Dan yang terakhir adalah, Anda harus mengubah tampilan dalam langkah 90 derajat (M_PI / 2) alih-alih 360 atau 180 derajat (2 * M_PI atau M_PI). Karena transformasi terjadi sebagai perkalian matriks nilai sinus dan nilai kosinus.
Jadi, katakanlah jika Anda menggunakan transformasi 180 derajat, cosinus dari 180 menghasilkan -1 yang membuat tampilan berubah dalam arah yang berlawanan setiap kali (Catatan-Nate juga akan memiliki masalah ini jika Anda mengubah nilai transformasi untuk M_PI). Transformasi 360 derajat hanya meminta pandangan untuk tetap di tempatnya, karenanya Anda tidak melihat rotasi sama sekali.
sumber
rotateImageView
itu sudah selesai. Jadi itu tidak benar-benar rekursif dalam arti itu.Jika yang ingin Anda lakukan adalah memutar gambar tanpa henti, ini berfungsi dengan sangat baik, dan sangat sederhana:
Dalam pengalaman saya, ini berfungsi dengan sempurna, tetapi pastikan gambar Anda mampu diputar di sekitar pusatnya tanpa ada offset, atau animasi gambar akan "melompat" begitu berhasil masuk ke PI.
Untuk mengubah arah putaran, ubah tanda
angle
(angle *= -1
).Perbarui Komentar oleh @AlexPretzlav membuat saya mengunjungi kembali ini, dan saya menyadari bahwa ketika saya menulis ini, gambar yang saya putar dicerminkan di sepanjang sumbu vertikal dan horizontal, artinya gambar itu memang hanya berputar 90 derajat dan kemudian mengatur ulang, meskipun tampak seperti itu terus berputar sepanjang jalan.
Jadi, jika gambar Anda seperti milik saya, ini akan bekerja dengan baik, namun, jika gambar tersebut tidak simetris, Anda akan melihat "jepret" kembali ke orientasi semula setelah 90 derajat.
Untuk memutar gambar yang tidak simetris, Anda lebih baik dengan jawaban yang diterima.
Salah satu solusi yang kurang elegan ini, seperti terlihat di bawah, akan benar-benar memutar gambar, tetapi mungkin ada gagap yang terlihat ketika animasi dimulai kembali:
Anda juga bisa melakukan ini hanya dengan blok, seperti yang disarankan @ richard-j-ross-iii, tetapi Anda akan mendapatkan peringatan loop tetap karena blok tersebut menangkap dirinya sendiri:
sumber
UIViewAnimationOptionRepeat
mengatur animasi Andaoptions
.Kontribusi saya dengan Swift Extension dari solusi yang diperiksa:
Cepat 4.0
Usang:
sumber
.infinity
.Jawaban hebat David Rysanek diperbarui ke Swift 4 :
sumber
Gunakan seperempat putaran, dan tingkatkan putaran secara bertahap.
sumber
Ini bekerja untuk saya:
sumber
Saya telah menemukan kode yang bagus di repositori ini ,
Berikut adalah kode dari itu saya telah melakukan perubahan kecil sesuai dengan kebutuhan saya akan kecepatan :)
UIImageView + Rotate.h
UIImageView + Rotate.m
sumber
Ini solusi cepat saya sebagai ekstensi UIView. Ini dapat dianggap sebagai simulasi perilaku UIActivityIndicator pada UIImageView apa pun.
sumber
Versi Swift3:
Dan ingat untuk memanggil
startRotate
diviewWillAppear
tidakviewDidLoad
.sumber
Anda juga dapat melakukan jenis animasi yang sama menggunakan UIView dan blok. Berikut adalah metode ekstensi kelas yang dapat memutar tampilan dengan sudut apa pun.
sumber
Jika ada yang menginginkan solusi nates tetapi dengan cepat, berikut ini terjemahan kasarnya:
sumber
untuk xamarin ios:
sumber
Ini adalah bagaimana saya memutar 360 ke arah yang benar.
sumber
Buat animasi
Tambahkan ke tampilan seperti ini
Bagaimana jawaban ini berbeda? Anda akan memiliki kode pembersih cara jika sebagian besar fungsi Anda mengembalikan objek, bukan hanya memanipulasi beberapa objek di sana-sini.
sumber
Ada beberapa cara untuk melakukan animasi 360 derajat dengan UIView.
Menggunakan CABasicAnimation
Berikut ini adalah fungsi ekstensi untuk UIView yang menangani operasi rotasi mulai & berhenti:
Sekarang menggunakan, penutupan UIView.animation :
sumber
Jawaban @ ram sangat membantu. Inilah versi Swift dari jawabannya.
Cepat 2
Cepat 3,4,5
sumber
var stop = false
private func stopRotation() { stop = true }
Lalu, di dalamif finished {...}
:if finished { if stop { return} self.rotateImageView() }
Saya telah mengembangkan kerangka animasi mengkilap yang dapat menghemat waktu Anda! Menggunakannya, animasi ini dapat dibuat dengan sangat mudah:
untuk menghentikan animasi ini cukup diatur
nil
keendlessRotater
.Jika Anda tertarik, silakan lihat: https://github.com/hip4yes/Animatics
sumber
Swift 4 ,
Ref
sumber
Cepat 4.0
sumber
Swift 5 UIView Extension menggunakan Animasi Keyframe
Pendekatan ini memungkinkan kita untuk secara langsung menggunakan UIView.AnimationOptions.repeat
sumber
Cepat:
sumber
Swift 3:
sumber
sumber
Saya pikir Anda sebaiknya menambahkan
UIVIew
Kategori:Implementasi UIView (Putar)
Tidak menggunakan metode ini :)
sumber