Saya telah mencari banyak barang SO dan referensi Apple, tetapi masih tidak dapat mengelola masalah saya.
Apa yang saya punya:
- Sebuah layar dengan 2
UIImageView
detik dan 2UIButton
detik terhubung dengannya - 2 jenis animasi:
- Meningkatkan dan menurunkan skala setiap gambar, satu demi satu, hanya sekali
viewDidLoad
- Ketika sebuah tombol ditekan (tombol kustom tersembunyi 'di dalam' masing-masing
UIImageView
) itu memicu animasi yang sesuaiUIImageView
–hanya satu, tidak keduanya– (juga skala naik, lalu turun). - Saat saya menulis untuk iOS4 +, saya diberitahu untuk menggunakan animasi berbasis blok!
- Meningkatkan dan menurunkan skala setiap gambar, satu demi satu, hanya sekali
Apa yang saya butuhkan:
Bagaimana cara membatalkan animasi yang sedang berjalan? Aku sudah berhasil membatalkan semuanya kecuali yang terakhir ...: /
Ini cuplikan kode saya:
[UIImageView animateWithDuration:2.0
delay:0.1
options:UIViewAnimationOptionAllowUserInteraction
animations:^{
isAnimating = YES;
self.bigLetter.transform = CGAffineTransformScale(self.bigLetter.transform, 2.0, 2.0);
} completion:^(BOOL finished){
if(! finished) return;
[UIImageView animateWithDuration:2.0
delay:0.0
options:UIViewAnimationOptionAllowUserInteraction
animations:^{
self.bigLetter.transform = CGAffineTransformScale(self.bigLetter.transform, 0.5, 0.5);
} completion:^(BOOL finished){
if(! finished) return;
[UIImageView animateWithDuration:2.0
delay:0.0
options:UIViewAnimationOptionAllowUserInteraction
animations:^{
self.smallLetter.transform = CGAffineTransformScale(self.smallLetter.transform, 2.0, 2.0);
} completion:^(BOOL finished){
if(! finished) return;
[UIImageView animateWithDuration:2.0
delay:0.0
options:UIViewAnimationOptionAllowUserInteraction
animations:^{
self.smallLetter.transform = CGAffineTransformScale(self.smallLetter.transform, 0.5, 0.5);
}
completion:^(BOOL finished){
if (!finished) return;
//block letter buttons
[self.bigLetterButton setUserInteractionEnabled:YES];
[self.smallLetterButton setUserInteractionEnabled:YES];
//NSLog(@"vieDidLoad animations finished");
}];
}];
}];
}];
Entah bagaimana smallLetter
UIImageView
ini tidak berfungsi dengan baik, karena ketika ditekan (melalui tombol) bigLetter
membatalkan animasi dengan benar ...
EDIT:
Saya telah menggunakan solusi ini, tetapi masih mengalami masalah dengan memperkecil smallLetter
UIImageView
- tidak membatalkan sama sekali ...
solusi
EDIT2: Saya telah menambahkan ini di awal metode berikutnya / sebelumnya:
- (void)stopAnimation:(UIImageView*)source {
[UIView animateWithDuration:0.01
delay:0.0
options:(UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction)
animations:^ {
source.transform = CGAffineTransformIdentity;
}
completion:NULL
];
}
masalah tetap ...: / tidak tahu bagaimana menghentikan animasi terakhir untuk huruf dalam rantai animasi
Jawaban:
Anda dapat menghentikan semua animasi pada tampilan dengan memanggil:
[view.layer removeAllAnimations];
(Anda harus mengimpor kerangka QuartzCore untuk memanggil metode di view.layer).
Jika Anda ingin menghentikan animasi tertentu, tidak semua animasi, taruhan terbaik Anda adalah menggunakan CAAnimations secara eksplisit daripada metode pembantu animasi UIView, maka Anda akan memiliki kontrol yang lebih terperinci dan dapat menghentikan animasi secara eksplisit berdasarkan nama.
Dokumentasi Apple Core Animation dapat ditemukan di sini:
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html
sumber
Untuk iOS 10 gunakan UIViewPropertyAnimator untuk membuat animasi. Ini menyediakan metode untuk memulai, menghentikan, dan menjeda animasi UIView.
let animator = UIViewPropertyAnimator(duration: 2.0, curve: .easeOut){ self.view.alpha = 0.0 } // Call this to start animation. animator.startAnimation() // Call this to stop animation. animator.stopAnimation(true)
sumber
Saya akan menambahkan jawaban Nick bahwa untuk membuat removeAllAnimations ide selanjutnya menjadi sangat berguna.
[view.layer removeAllAnimations]; [UIView transitionWithView:self.redView duration:1.0f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ [view.layer displayIfNeeded]; } completion:nil];
sumber
Anda dapat mencoba ini (di Swift):
UIView.setAnimationsEnabled(false) UIView.setAnimationsEnabled(true)
Catatan: Anda dapat meletakkan kode di antara kedua panggilan tersebut jika perlu, misalnya:
UIView.setAnimationsEnabled(false) aview.layer.removeAllAnimations() // remove layer based animations e.g. aview.layer.opacity UIView.setAnimationsEnabled(true)
sumber