จะสร้างแอนิเมชั่นตีกลับ UIView ได้อย่างไร?


93

ฉันมี CATransition ต่อไปนี้สำหรับ UIView ที่เรียกว่าfinalScoreViewซึ่งทำให้เข้าสู่หน้าจอจากด้านบน:

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"];

จะทำยังไงให้มันเด้งทันทีหลังจากลงมาแล้วก็ยังอยู่ มันควรจะยังคงเข้าสู่หน้าจอจากด้านบน แต่จะเด้งขึ้นเมื่อมันลงมา

ความช่วยเหลือใด ๆ จะได้รับการชื่นชมมากขอบคุณ!


3
คุณกำหนดเป้าหมาย iOS7 ขึ้นไปหรือไม่ ถ้าเป็นเช่นนั้นคุณสามารถใช้ประโยชน์จาก UIKit Dynamics
WDUK

คำตอบ:


146

ด้วย iOS7 และ UIKit Dynamics ไม่จำเป็นต้องใช้CAKeyframeAnimationsหรือUIViewภาพเคลื่อนไหวอีกต่อไป!

ลองดูที่แอปเปิ้ลแอป UIKit Dynamics แคตตาล็อก อีกทางหนึ่ง Teehanlax มีความชัดเจนรัดกุมกวดวิชากับโครงการเต็มรูปแบบใน GitHub หากคุณต้องการบทช่วยสอนโดยละเอียดเพิ่มเติมเกี่ยวกับรายละเอียดของพลวัตบทแนะนำ Ray Winderlichนั้นยอดเยี่ยม เช่นเคยเอกสารของ Apple เป็นจุดเริ่มต้นที่ยอดเยี่ยมดังนั้นโปรดดูการอ้างอิงคลาส UIDynamicAnimatorในเอกสาร

นี่คือโค้ดเล็กน้อยจากบทช่วยสอน 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];

และนี่คือผลลัพธ์

เหลี่ยมเด้ง

UIKit Dynamics เป็นส่วนเสริมที่ทรงพลังและใช้งานง่ายสำหรับ iOS7 และคุณจะได้รับ UI ที่ดูดีจากมัน

ตัวอย่างอื่น ๆ :

ปุ่มเด้ง

สไลด์เด้ง

คอลเลกชัน Springy

คอลเลกชันฤดูใบไม้ผลิ WWDC

ขั้นตอนในการใช้พลวัตของ UIKit นั้นเหมือนกันเสมอ:

  1. สร้างUIDynamicAnimatorและเก็บไว้ในทรัพย์สินที่แข็งแกร่ง
  2. สร้างอย่างน้อยหนึ่งรายการ UIDynamicBehaviorsรายการ พฤติกรรมแต่ละอย่างควรมีอย่างน้อยหนึ่งรายการโดยทั่วไปจะเป็นมุมมองเพื่อเคลื่อนไหว
  3. ตรวจสอบให้แน่ใจว่าสถานะเริ่มต้นของรายการที่ใช้UIDynamicBehaviorsเป็นสถานะที่ถูกต้องภายในการUIDynamicAnimatorจำลอง

1
สวัสดี Michael ขอบคุณมากสำหรับความช่วยเหลือของคุณ! นี่ดูง่ายสุด ๆ เลย! ฉันลองแล้วและใช้งานได้เมื่อมันไปถึงด้านล่างของมุมมอง แต่มันใช้ไม่ได้กับมุมมองอื่น - stackoverflow.com/questions/21895674/… - ฉันจะชอบถ้าคุณสามารถช่วยฉันได้! :) ขอบคุณ
user3127576

2
บทช่วยสอนที่ยอดเยี่ยม แต่คุณจะใช้โค้ดเพียงบรรทัดเดียวโดยใช้SpringWithDampingเพื่อตีกลับ!
Fattie

2
คุณสามารถแบ่งปันตัวอย่างโค้ดสำหรับภาพเคลื่อนไหวตีกลับ Uitableview ตามด้านบนได้ไหม ฉันกำลังลองใช้ UITableview แต่ไม่แน่ใจว่าจะเริ่มจากตรงไหน
Dinesh

1
UIKit Dynamics ดีมากเมื่อคุณจัดการกับกรณีตัวอย่าง แต่เมื่อพูดถึงงานจริงคุณจะเห็นว่ามันดิบและ จำกัด แค่ไหน ปัญหาใหญ่อย่างหนึ่งคือการลบล้างUIDynamicItemBehavior(ซึ่งเป็นคุณสมบัติไม่ใช่พฤติกรรม) คุณไม่สามารถใช้คุณสมบัติทางกายภาพที่แตกต่างกันในพฤติกรรมต่างๆ อีกกรณีหนึ่งคือการใช้ขอบยางแบบ UIScrollView - มันซับซ้อนมาก ฉันสามารถเขียนได้มากกว่านี้ แต่ความคิดเห็นสั้นเกินไป
kelin

2
กรุณาเพิ่มรหัสแบบเต็ม รหัสของคุณอธิบายวิธีการสร้างUIDynamicAnimatorและวัตถุที่เกี่ยวข้อง แต่ไม่ได้ตอบวิธีใช้
Vyachaslav Gerchicov

263

ทางเลือกที่ง่ายกว่าUIDynamicAnimatorใน iOS 7 คือ Spring Animation (อนิเมชั่นบล็อก UIView ใหม่ที่ทรงพลัง) ซึ่งสามารถให้เอฟเฟกต์การตีกลับที่ดีพร้อมการลดความเร็วและความเร็ว: Objective C

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

รวดเร็ว

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

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 == เด้งมาก 1.0 ทำให้ลดความเร็วได้อย่างราบรื่นโดยไม่ต้องถ่ายภาพมากเกินไป

initialSpringVelocityคือ "ระยะทางที่ต้องการหารด้วยวินาทีที่ต้องการ" โดยประมาณ 1.0 สอดคล้องกับระยะทางทั้งหมดของภาพเคลื่อนไหวที่เคลื่อนที่ในหนึ่งวินาที ตัวอย่างระยะห่างของภาพเคลื่อนไหวทั้งหมดคือ 200 จุดและคุณต้องการให้จุดเริ่มต้นของภาพเคลื่อนไหวตรงกับความเร็วในการรับชมที่ 100 pt / s ให้ใช้ค่า 0.5

รายละเอียดเพิ่มเติมเกี่ยวกับบทช่วยสอนและแอปตัวอย่างสามารถพบได้ในบทช่วยสอนนี้ ฉันหวังว่านี่จะเป็นประโยชน์สำหรับใครบางคน


2
นี่คือโครงการสาธิตที่ฉันสร้างขึ้นเพื่อช่วยให้คุณได้ภาพเคลื่อนไหวที่ถูกต้อง สนุก! github.com/jstnheo/SpringDampingDemo
jstn

ไชโยสำหรับโครงการสาธิตนั้นเพื่อน ช่วยหาค่าเหล่านี้ได้จริง ๆ เนื่องจากมันค่อนข้างป้าน ฉันหวังว่า Apple จะทำให้พวกเขาชัดเจนขึ้น
kakubei

32

นี่คือโครงการสาธิตที่ฉันสร้างขึ้นเพื่อช่วยให้คุณได้ภาพเคลื่อนไหวที่ถูกต้อง สนุก!

สปริงแดมมิ่งสาธิต

ป้อนคำอธิบายภาพที่นี่


ไชโยสำหรับโครงการสาธิตนั้นเพื่อน ช่วยหาค่าเหล่านี้ได้จริง ๆ เนื่องจากมันค่อนข้างป้าน ฉันหวังว่า Apple จะทำให้พวกเขาชัดเจนขึ้น
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) {
    }];
}
}

1
ไม่มีคำอธิบายในโค้ดและไม่มีความคิดเห็น สิ่งนี้ไม่เป็นประโยชน์
Lorenzo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.