Làm cách nào để hủy hoạt ảnh dựa trên khối UIView?


86

Tôi đã tìm kiếm rất nhiều thứ SO và trong các tài liệu tham khảo của Apple, nhưng vẫn không thể quản lý được sự cố của mình.

Tôi có gì:

  1. Một màn hình có 2 UIImageViewgiây và 2 UIButtongiây được kết nối với chúng
  2. 2 loại hoạt hình:
    1. Mở rộng tỷ lệ lên và sau đó xuống của từng hình ảnh, cái khác, chỉ một lần trong viewDidLoad
    2. Khi nhấn một nút (nút tùy chỉnh ẩn 'bên trong' của mỗi nút UIImageView), nó sẽ kích hoạt hoạt ảnh thích hợp UIImageView–chỉ một, không phải cả hai– (cũng tăng tỷ lệ, sau đó giảm xuống).
    3. Khi tôi đang viết cho iOS4 + Tôi được yêu cầu sử dụng hoạt ảnh dựa trên khối!

Tôi cân gi:

Làm cách nào để hủy hoạt ảnh đang chạy? Cuối cùng thì tôi cũng đã hủy được, trừ cái cuối cùng ...: /

Đây là đoạn mã của tôi:

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

Bằng cách nào đó, smallLetter UIImageViewnó không hoạt động bình thường, bởi vì khi nhấn (nút thông qua) bigLetterđang hủy hoạt ảnh đúng cách ...

CHỈNH SỬA: Tôi đã sử dụng giải pháp này, nhưng vẫn gặp sự cố với việc thu nhỏ quy mô smallLetter UIImageView- hoàn toàn không hủy ... giải pháp

EDIT2: Tôi đã thêm điều này vào đầu các phương pháp tiếp theo / trước:

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

sự cố vẫn ...: / không biết cách ngắt hoạt ảnh cuối cùng cho các chữ cái trong chuỗi hoạt ảnh


Này, tôi nghĩ câu trả lời của Hari Kunwar nên được chấp nhận ngay bây giờ.
marczellm

Ngày nay, bạn phải sử dụng UIViewPropertyAnimator - nó cũng dễ dàng hơn rất nhiều.
Fattie

Câu trả lời:


151

Bạn có thể dừng tất cả hoạt ảnh trên một chế độ xem bằng cách gọi:

[view.layer removeAllAnimations];

(Bạn sẽ cần nhập khung công tác QuartzCore để gọi các phương thức trên view.layer).

Nếu bạn muốn dừng một hoạt ảnh cụ thể, không phải tất cả các hoạt ảnh, cách tốt nhất của bạn là sử dụng CAAnimations một cách rõ ràng thay vì các phương thức trợ giúp hoạt ảnh UIView, khi đó bạn sẽ có quyền kiểm soát chi tiết hơn và có thể dừng hoạt ảnh rõ ràng theo tên.

Tài liệu Apple Core Animation có thể được tìm thấy tại đây:

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


10
Tôi chỉ muốn thêm, theo quan sát của riêng tôi, animateWithDuration tiếp theo không hoạt động nữa sau khi gọi removeAllAnimations. Điều này là để thực hiện điều khiển phân trang và kéo để làm mới, có lẽ ai đó có thể quan sát thấy điều gì đó khác biệt. Tôi kết thúc bằng cách sử dụng CABasicAnimation và gọi [myView.layer removeAnimationForKey: @ "animationKey"];
Zhang

Cảm ơn mẹo @Nick - xin lưu ý rằng liên kết dường như không còn được hỗ trợ nữa, hãy thử cái này để thay thế: developer.apple.com/library/ios/documentation/Cocoa/Conceptual/…
trdavidson

52

Đối với iOS 10, hãy sử dụng UIViewPropertyAnimator để tạo hoạt ảnh. Nó cung cấp các phương pháp để bắt đầu, dừng và tạm dừng các hoạt ảnh 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

Tôi muốn thêm vào câu trả lời của Nick rằng để làm cho ý tưởng tiếp theo của removeAllAnimations trở nên rất hữu ích.

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

0

Bạn có thể thử điều này (trong Swift):

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

Lưu ý: bạn có thể đặt mã giữa hai cuộc gọi đó nếu cần, ví dụ:

UIView.setAnimationsEnabled(false)
aview.layer.removeAllAnimations() // remove layer based animations e.g. aview.layer.opacity
UIView.setAnimationsEnabled(true)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.