Bagaimana cara membuat animasi bouncing UIView?

92

Saya memiliki CATransition berikut untuk UIView yang disebut finalScoreView, yang membuatnya masuk ke layar dari atas:

CATransition *animation = [CATransition animation];
animation.duration = 0.2;
animation.type = kCATransitionPush;
animation.subtype = kCATransitionFromBottom;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];

[gameOver.layer addAnimation:animation forKey:@"changeTextTransition"];
[finalScoreView.layer addAnimation:animation forKey:@"changeTextTransition"];

Bagaimana cara membuatnya agar memantul setelah turun, lalu tetap diam? Itu masih harus masuk ke layar dari atas tetapi kemudian memantul saat turun.

Bantuan apa pun akan sangat dihargai, terima kasih!

pengguna3127576
sumber
3
Apakah Anda menargetkan iOS7 ke atas? Jika demikian, Anda dapat memanfaatkan UIKit Dynamics
WDUK

Jawaban:

144

Dengan iOS7 dan UIKit Dynamics, tidak perlu lagi menggunakan CAKeyframeAnimationsatau UIViewanimasi!

Lihatlah aplikasi Katalog Dinamika UIKit Apple . Bergantian, Teehanlax memiliki tutorial yang jelas dan ringkas dengan proyek lengkap di github . Jika Anda menginginkan tutorial yang lebih rinci tentang seluk beluk dinamika, tutorial Ray Winderlich sangat bagus. Seperti biasa, dokumen Apple adalah perhentian pertama yang bagus, jadi lihat referensi Kelas UIDynamicAnimator di dokumen.

Berikut sedikit kode dari tutorial Teenhanlax:

self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

UIGravityBehavior* gravityBehavior = 
                [[UIGravityBehavior alloc] initWithItems:@[self.redSquare]];
[self.animator addBehavior:gravityBehavior];

UICollisionBehavior* collisionBehavior = 
                [[UICollisionBehavior alloc] initWithItems:@[self.redSquare]]; 
collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
[self.animator addBehavior:collisionBehavior];

UIDynamicItemBehavior *elasticityBehavior = 
                [[UIDynamicItemBehavior alloc] initWithItems:@[self.redSquare]];
elasticityBehavior.elasticity = 0.7f;
[self.animator addBehavior:elasticityBehavior];

Dan inilah hasilnya

Pantulan persegi

UIKit Dynamics adalah tambahan yang sangat kuat dan mudah digunakan untuk iOS7 dan Anda bisa mendapatkan beberapa UI yang tampak hebat darinya.

Contoh lain:

Tombol memantul Pantulan geser Koleksi kenyal Koleksi sprint WWDC

Langkah-langkah untuk mengimplementasikan dinamika UIKit selalu sama:

  1. Buat UIDynamicAnimatordan simpan di properti yang kuat
  2. Buat satu atau lebih UIDynamicBehaviors. Setiap perilaku harus memiliki satu atau lebih item, biasanya tampilan untuk dianimasikan.
  3. Pastikan status awal item yang digunakan UIDynamicBehaviorsadalah status valid dalam UIDynamicAnimatorsimulasi.
memmons
sumber
1
Hai Michael, terima kasih banyak atas bantuan Anda! Ini jelas terlihat sangat mudah dilakukan! Saya mencobanya dan berhasil saat menyentuh bagian bawah tampilan, tetapi tidak berfungsi dengan tampilan lain - stackoverflow.com/questions/21895674/… - Saya akan senang jika Anda dapat membantu saya di luar sana! :) Terima kasih
user3127576
2
Tutorial YANG LUAR BIASA TAPI Anda hanya menggunakan satu baris kode, usingSpringWithDamping, untuk pentalan!
Fattie
2
Bisakah Anda membagikan beberapa contoh kode untuk animasi pantulan Uitableview seperti di atas. Saya mencoba dengan UITableview tetapi tidak yakin dari mana harus memulai.
Dinesh
1
UIKit Dynamics sangat bagus ketika Anda menangani kasus-kasus contoh. Tetapi ketika sampai pada tugas nyata, Anda melihat betapa mentah dan terbatasnya itu. Satu masalah besar adalah menimpa UIDynamicItemBehavior(yang sebenarnya adalah properti, bukan perilaku). Anda tidak bisa hanya menggunakan sifat fisik yang berbeda dalam perilaku yang berbeda. Kasus lain adalah menerapkan batas karet seperti UIScrollView - ini sangat rumit. Saya dapat menulis lebih banyak lagi tetapi komentar terlalu pendek.
kelin
2
tolong tambahkan kode lengkap. Kode Anda menjelaskan cara membuat UIDynamicAnimatordan objek yang terkait dengannya tetapi tidak menjawab cara menggunakannya
Vyachaslav Gerchicov
261

Alternatif yang lebih sederhana UIDynamicAnimatordi iOS 7 adalah Animasi Musim Semi (animasi blok UIView yang baru dan kuat), yang dapat memberi Anda efek pantulan yang bagus dengan redaman dan kecepatan: Objective C

[UIView animateWithDuration:duration
  delay:delay
  usingSpringWithDamping:damping
  initialSpringVelocity:velocity
  options:options animations:^{
    //Animations
    }
  completion:^(BOOL finished) {
    //Completion Block
}];

Cepat

UIView.animateWithDuration(duration,
     delay: delay,
     usingSpringWithDamping: damping,
     initialSpringVelocity: velocity,
     options: options,
     animations: {
            //Do all animations here
            }, completion: {
            //Code to run after animating
                (value: Bool) in
        })

Swift 4.0.0

UIView.animate(withDuration:duration,
     delay: delay,
     usingSpringWithDamping: damping,
     initialSpringVelocity: velocity,
     options: options,
     animations: {
            //Do all animations here
            }, completion: {
            //Code to run after animating
                (value: Bool) in
        })

usingSpringWithDamping 0,0 == sangat goyang. 1.0 membuatnya melambat dengan mulus tanpa overshooting.

initialSpringVelocityadalah, secara kasar, "jarak yang diinginkan, dibagi dengan detik yang diinginkan". 1.0 sesuai dengan total jarak animasi yang dilalui dalam satu detik. Contoh, total jarak animasi adalah 200 poin dan Anda ingin awal animasi sesuai dengan kecepatan tampilan 100 pt / s, gunakan nilai 0,5.

Tutorial lebih rinci dan aplikasi sampel dapat ditemukan di tutorial ini . Semoga bermanfaat bagi seseorang.

huong
sumber
2
Berikut adalah proyek demo yang saya buat untuk membantu Anda mendapatkan animasi yang tepat. Nikmati! github.com/jstnheo/SpringDampingDemo
jstn
Bersulang untuk proyek demo itu, sobat. Sangat membantu mengetahui nilai-nilai ini karena mereka cukup tumpul. Saya berharap Apple membuatnya lebih jelas
kakubei
32

Berikut adalah proyek demo yang saya buat untuk membantu Anda mendapatkan animasi yang tepat. Nikmati!

SpringDampingDemo

masukkan deskripsi gambar di sini

jstn
sumber
Bersulang untuk proyek demo itu, sobat. Sangat membantu mengetahui nilai-nilai ini karena mereka cukup tumpul. Saya berharap Apple membuatnya lebih jelas
kakubei
-1
- (IBAction)searchViewAction:(UIButton*)sender
{
  if(sender.tag == 0)
  {
    sender.tag = 1;

    CGRect optionsFrame2 = self.defaultTopView.frame;
    optionsFrame2.origin.x = -320;

    CGRect optionsFrame = self.searhTopView.frame;
    optionsFrame.origin.x = 320;
    self.searhTopView.frame = optionsFrame;

    [UIView animateWithDuration:1.0 delay:0.0 usingSpringWithDamping:0.5 initialSpringVelocity:1.0 options:0 animations:^{

        CGRect optionsFrame = self.searhTopView.frame;

        optionsFrame.origin.x = 0;
        self.searhTopView.frame = optionsFrame;
        self.defaultTopView.frame = optionsFrame2;
    } completion:^(BOOL finished) {
    }];        
}
else
{
    sender.tag = 0;

    CGRect optionsFrame2 = self.defaultTopView.frame;
    optionsFrame2.origin.x = 0;

    CGRect optionsFrame = self.searhTopView.frame;
    optionsFrame.origin.x = 320;

    [UIView animateWithDuration:1.0 delay:0.0 usingSpringWithDamping:0.5 initialSpringVelocity:1.0 options:0 animations:^{

        CGRect optionsFrame = self.searhTopView.frame;

        optionsFrame.origin.x = 320;
        self.searhTopView.frame = optionsFrame;
        self.defaultTopView.frame = optionsFrame2;
    } completion:^(BOOL finished) {
    }];
}
}
Spydy
sumber
1
Tidak ada penjelasan dalam kode dan tidak ada komentar. Ini tidak membantu
Lorenzo