2015-02-04 16 views
10

Tôi đang viết ứng dụng máy ảnh và gặp sự cố khi hiển thị hình vuông lấy nét khi người dùng chạm vào màn hình.Làm cách nào để hủy hoạt ảnh trước khi hoạt ảnh mới được kích hoạt?

Mã của tôi là (trong nhanh chóng):

self.focusView.center = sender.locationInView(self.cameraWrapper) 
self.focusView.transform = CGAffineTransformMakeScale(2, 2) 
self.focusView.hidden = false 

UIView.animateWithDuration(0.5, animations: { [unowned self]() -> Void in 
    self.focusView.transform = CGAffineTransformIdentity 
}, completion: { (finished) -> Void in 
    UIView.animateWithDuration(0.5, delay: 1.0, options: nil, animations: {() -> Void in 
     self.focusView.alpha = 0.0 
    }, completion: { (finished) -> Void in 
      self.focusView.hidden = true 
      self.focusView.alpha = 1.0 
    }) 
}) 

Tuy nhiên, nếu sử dụng chạm vào màn hình liên tục khi hoạt hình trước đó không hoàn thành, các phim hoạt hình cũ và mới sẽ trộn lên và quan điểm tập trung sẽ có biểu hiện lạ , ví dụ, nó sẽ biến mất rất nhanh.

Mọi người có thể cho tôi biết cách hủy hoạt ảnh trước đó, đặc biệt là khối hoàn thành trước đó không?

+0

cố gắng sử dụng biến BOOL thành viên và làm cho nó có trong hình động dựa trên có và không cố gắng để động nó – Tendulkar

+0

Hãy thử UIView.setAnimationBeginsFromCurrentState (true); trước khi bắt đầu hoạt hình – Jageen

+0

có thể trùng lặp của [Làm cách nào để hủy hoạt ảnh dựa trên khối UIView?] (http://stackoverflow.com/questions/9569943/how-to-cancel-uiview-block-based-animation) –

Trả lời

25

Bạn có thể sử dụng phương pháp removeAllAnimations ngừng hoạt hình
Thay thế mã của bạn với bên dưới

self.focusView.center = sender.locationInView(self.cameraWrapper) 
self.focusView.transform = CGAffineTransformMakeScale(2, 2) 
self.focusView.hidden = false 
self.focusView.layer.removeAllAnimations() // <<==== Solution 
UIView.animateWithDuration(0.5, animations: { [unowned self]() -> Void in 
    self.focusView.transform = CGAffineTransformIdentity 
}, completion: { (finished) -> Void in 

    UIView.animateWithDuration(0.5, delay: 1.0, options: nil, animations: {() -> Void in 
     self.focusView.alpha = 0.0 
    }, completion: { (finished) -> Void in 
      self.focusView.hidden = true 
      self.focusView.alpha = 1.0 
    }) 
}) 


tham khảo: link
enter image description here

+0

Tôi đã thử phương pháp của bạn và dường như xóa hoạt ảnh hiện tại nhưng hoạt ảnh mới không chạy chính xác. Nút của tôi gọi một hình động. Khi tôi nhấn vào nút, hoạt ảnh sẽ bắt đầu. Khi tôi nhấn lại lần nữa, tôi muốn hoạt ảnh dừng lại và khởi động lại từ đầu. Tuy nhiên, bằng cách sử dụng phương pháp xóa của bạn, nó dừng lại và sau đó chạy một số hoạt hình rất ngắn và sai lầm. Bất kỳ ý tưởng nào về lý do tại sao? –

+0

@DaveG bạn vui lòng chia sẻ mã của bạn? – Jageen

+0

Chỉ cần đăng một vài giờ trước đây: http://stackoverflow.com/questions/32449016/consecutive-animation-calls-not-working/32449640#32449640 –

0

Trong trường hợp của tôi, tôi chỉ cần thiết để thiết lập giá trị , tôi hoạt hình với giá trị cụ thể.

Ví dụ:

if ([indexPath isEqual:self.currentPlayerOrderIndexPath]) 
    { 
     [UIView animateWithDuration:0.5 
           delay:0.0 
          options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveEaseInOut 
         animations:^{ 
          cell.avatarImageV.transform = CGAffineTransformMakeScale(1.15,1.15); 
         } 
         completion:NULL]; 
    } 
    else 
    { 
     cell.avatarImageV.transform = CGAffineTransformMakeScale(1.0, 1.0); 
0

Trong trường hợp của tôi, tôi thêm chỉ báo lấy nét bằng cách sử dụng addSubview().

self.view.addSubview(square) 

hình vuông là UIView I được xác định trong hàm. Vì vậy, khi người dùng chạm vào màn hình để lấy nét, chức năng này sẽ thêm một hình vuông trên màn hình con. Và để hủy hoạt ảnh này khi chạm tiếp theo xảy ra, tôi chỉ đơn giản là sử dụng hàm removeFromSuperview(), khi hàm này gọi nó loại bỏ khung nhìn từ superview của nó, đó là hình vuông lấy nét ở đây.

filterView.subviews.forEach({ $0.removeFromSuperview() }) 

Khác với phương pháp trên để xóa hoạt ảnh nhưng trực tiếp xóa trực tiếp chế độ xem phụ.

Các vấn đề liên quan