จะยกเลิก UIView ภาพเคลื่อนไหวแบบบล็อกได้อย่างไร?


86

ฉันได้ค้นหาสิ่ง SO มากมายและในข้อมูลอ้างอิงของ Apple แต่ก็ยังไม่สามารถจัดการปัญหาของฉันได้

สิ่งที่ฉันมี:

  1. หน้าจอที่มี 2 UIImageViewวินาทีและ 2 UIButtonวินาทีเชื่อมต่ออยู่
  2. แอนิเมชั่น 2 ประเภท:
    1. ปรับขนาดขึ้นแล้วลงของแต่ละภาพทีละภาพเพียงครั้งเดียว viewDidLoad
    2. เมื่อกดปุ่ม (ปุ่มแบบกำหนดเองที่ซ่อนอยู่ 'ด้านใน' ของแต่ละปุ่มUIImageView) จะทำให้เกิดภาพเคลื่อนไหวของภาพเคลื่อนไหวที่เหมาะสมUIImageViewเพียงปุ่มเดียวไม่ใช่ทั้งสองอย่าง (ปรับขนาดขึ้นแล้วลงด้วย)
    3. ขณะที่ฉันเขียนสำหรับ iOS4 + ฉันได้รับคำสั่งให้ใช้แอนิเมชั่นแบบบล็อก!

สิ่งที่ฉันต้องการ:

ฉันจะยกเลิกภาพเคลื่อนไหวที่กำลังทำงานอยู่ได้อย่างไร ฉันสามารถยกเลิกได้แล้ว แต่สุดท้าย ... : /

นี่คือข้อมูลโค้ดของฉัน:

[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");
                                      }];
            }];
        }];
    }];

ยังไงก็ตามการsmallLetter UIImageViewทำงานไม่ถูกต้องเนื่องจากเมื่อกด (ปุ่มผ่าน) bigLetterกำลังยกเลิกภาพเคลื่อนไหวอย่างถูกต้อง ...

แก้ไข: ผมเคยใช้วิธีนี้ แต่ยังคงมีปัญหากับการปรับลงsmallLetter UIImageView- ไม่ยกเลิกเลย ... วิธีการแก้ปัญหา

แก้ไข 2:ฉันได้เพิ่มสิ่งนี้ไว้ที่จุดเริ่มต้นของวิธีการถัดไป / ก่อนหน้า:

- (void)stopAnimation:(UIImageView*)source {
    [UIView animateWithDuration:0.01
                          delay:0.0 
                        options:(UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction)
                     animations:^ {
                         source.transform = CGAffineTransformIdentity;
                     }
                     completion:NULL
     ];
}

ปัญหายังคงอยู่ ... : / ไม่รู้วิธีขัดจังหวะภาพเคลื่อนไหวสุดท้ายสำหรับตัวอักษรในห่วงโซ่ภาพเคลื่อนไหว


เฮ้ฉันคิดว่าคำตอบของ Hari Kunwar ควรได้รับการยอมรับแล้ว
marczellm

ทุกวันนี้คุณต้องใช้ UIViewPropertyAnimator - มันง่ายขึ้นมากเช่นกัน
Fattie

คำตอบ:


151

คุณสามารถหยุดภาพเคลื่อนไหวทั้งหมดในมุมมองได้โดยโทร:

[view.layer removeAllAnimations];

(คุณจะต้องนำเข้าเฟรมเวิร์ก QuartzCore เพื่อเรียกใช้เมธอดบน view.layer)

หากคุณต้องการหยุดภาพเคลื่อนไหวที่เฉพาะเจาะจงไม่ใช่ภาพเคลื่อนไหวทั้งหมดทางออกที่ดีที่สุดของคุณคือใช้ CAAnimations อย่างชัดเจนแทนที่จะใช้วิธีการช่วยเหลือภาพเคลื่อนไหว UIView คุณจะควบคุมได้ละเอียดมากขึ้นและสามารถหยุดภาพเคลื่อนไหวตามชื่อได้อย่างชัดเจน

สามารถดูเอกสาร Apple Core Animation ได้ที่นี่:

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html


10
เพียงแค่ต้องการเพิ่มในการสังเกตของฉันเอง animateWithDuration ที่ตามมาจะไม่ทำงานอีกต่อไปหลังจากเรียก removeAllAnimations นี่คือการกำหนดเลขหน้าและดึงเพื่อรีเฟรชการควบคุมบางทีคนอื่นอาจสังเกตเห็นบางอย่างที่แตกต่างออกไป ฉันลงเอยด้วยการใช้ CABasicAnimation และเรียก [myView.layer removeAnimationForKey: @ "animationKey"];
Zhang

ขอบคุณสำหรับเคล็ดลับ @Nick - โปรดทราบว่าลิงก์นี้ไม่ได้รับการสนับสนุนอีกต่อไปให้ลองใช้ลิงก์นี้แทน: developer.apple.com/library/ios/documentation/Cocoa/Conceptual/…
trdavidson

หลังจาก view.layer.removeAllAnimations () เพิ่มมุมมองภาพเคลื่อนไหวอีกครั้งไม่ทำงาน
Bunthoeun

52

สำหรับ iOS 10 ให้ใช้ UIViewPropertyAnimator เพื่อทำให้เคลื่อนไหว มีวิธีการเริ่มหยุดและหยุดภาพเคลื่อนไหว 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)

3

ฉันจะเพิ่มคำตอบของ Nick ว่าเพื่อให้ความคิดต่อไป removeAllAnimations ราบรื่นนั้นมีประโยชน์มาก

[view.layer removeAllAnimations];
[UIView transitionWithView:self.redView
                  duration:1.0f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
                      [view.layer displayIfNeeded];
                  } completion:nil];

0

คุณสามารถลองสิ่งนี้ (ใน Swift):

UIView.setAnimationsEnabled(false)
UIView.setAnimationsEnabled(true)

หมายเหตุ: คุณสามารถใส่รหัสระหว่างสองสายนี้ได้หากจำเป็นตัวอย่างเช่น:

UIView.setAnimationsEnabled(false)
aview.layer.removeAllAnimations() // remove layer based animations e.g. aview.layer.opacity
UIView.setAnimationsEnabled(true)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.