Masalah
Saya memicu animasi acak pada pilihan UIViews menggunakan Timer. Semua animasi berfungsi sebagaimana mestinya kecuali animasi yang metode pengundian CALayer dipanggil setelah keluar dari pemilih pengatur waktu.
Deskripsi Lengkap
Demi kejelasan dan penyederhanaan, izinkan saya membuat skema tindakan yang dilakukan.
Semua animasi yang saya buat sejauh ini berfungsi sebagaimana mestinya: merupakan kombinasi CABasicAnimations pada subtampilan/sublapisan yang ada atau yang baru ditambahkan ke hierarki tampilan yang dipilih. Mereka dikodekan sebagai ekstensi UIView, sehingga mereka dapat dipanggil pada tampilan apa pun, terlepas dari tampilan atau pengontrol tampilan tempat tampilan tersebut berada. Ya, semuanya berfungsi kecuali satu.
Saya memang telah membuat kelas CALayer khusus yang terdiri dari menggambar pola pada CALayer. Dalam ekstensi kelas khusus ini, terdapat metode untuk menganimasikan pola tersebut (lihat kode selanjutnya). Jadi secara keseluruhan, ketika saya mencapai langkah/metode animate selected view
dan menjalankan animasi khusus ini, inilah yang seharusnya terjadi:
- sebuah metode bernama animatePattern dipanggil
- metode ini menambahkan kelas CALayer khusus ke tampilan yang dipilih dan kemudian memanggil ekstensi animasi lapisan ini
Masalahnya: jika dengan semua animasi lainnya, semua gambar dilakukan sebelum keluar dari langkah/metode animate selected view
, dalam kasus tertentu, metode pengundian kelas CALayer khusus dipanggil setelah keluarnya metode performAnimation
, yang selanjutnya menyebabkan animasi terhenti.
Saya harus menambahkan bahwa saya telah mencoba animasi kelas CALayer khusus di taman bermain yang terpisah dan disederhanakan dan berfungsi dengan baik (saya menambahkan lapisan khusus ke UIView
dalam metode viewDidLoad
UIViewController dan kemudian saya memanggil animasi lapisan dalam metode viewDidAppear
UIViewController.)
Kode
metode yang dipanggil oleh
animate selected view
langkah/metode:func animatePattern(for duration: TimeInterval = 1) { let patternLayer = PatternLayer(effectType: .dark) patternLayer.frame = self.bounds self.layer.addSublayer(patternLayer) patternLayer.play(for: duration) }
(perhatikan bahwa metode ini dalam ekstensi UIView, oleh karena itu self
di sini mewakili UIView tempat animasi dipanggil)
Kelas CALayer kustom yang disederhanakan:
override var bounds: CGRect { didSet { self.setNeedsDisplay() } // Initializers override init() { super.init() self.setNeedsDisplay() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } init(effectType: EffectType){ super.init() // sets various properties self.setNeedsDisplay() } // Drawing override func draw(in ctx: CGContext) { super.draw(in: ctx) guard self.frame != CGRect.zero else { return } self.masksToBounds = true // do the drawings }
ekstensi animasi kelas CALayer khusus:
func play(for duration: Double, removeAfterCompletion: RemoveAfterCompletion = .no) { guard self.bounds != CGRect.zero else { print("Cannot animate nil layer") return } CATransaction.begin() CATransaction.setCompletionBlock { if removeAfterCompletion.removeStatus { if case RemoveAfterCompletion.yes = removeAfterCompletion { self.fadeOutDuration = 0.0 } self.fadeToDisappear(duration: &self.fadeOutDuration) } } // perform animations CATransaction.commit() }
Upaya sejauh ini
Saya telah mencoba untuk memaksa menggambar lapisan dengan memasukkan setNeedsDisplay
/ setNeedsLayout
di berbagai tempat dalam kode tetapi tidak berhasil: men-debug metode draw
kelas CALayer khusus terus-menerus dicapai setelah keluarnya metode performAnimation
, sementara itu harus dipanggil ketika bingkai lapisan dimodifikasi dalam metode animatePattern
. Saya pasti melewatkan sesuatu yang cukup jelas, tetapi saat ini saya sedang berlari berputar-putar dan saya akan menghargai perhatian baru terhadap hal itu.
Terima kasih sebelumnya telah meluangkan waktu untuk mempertimbangkan masalah ini! Terbaik,