2012-06-19 29 views
5

Tôi đang sử dụng hoạt ảnh xoay được tạo với CABasicAnimation. Nó quay UIView trong 2 giây. Nhưng tôi cần để có thể ngăn chặn nó khi chạm vào UIView. Nếu tôi xóa hoạt ảnh thì chế độ xem ở cùng vị trí như trước khi hoạt ảnh bắt đầu.Dừng CABasicAnimation tại điểm cụ thể

Đây là mã hoạt hình của tôi:

float duration = 2.0; 
float rotationAngle = rotationDirection * ang * speed * duration; 
//rotationAngle = 3*(2*M_PI);//(double)rotationAngle % (double)(2*M_PI) ; 
CABasicAnimation* rotationAnimation; 
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
rotationAnimation.toValue = [NSNumber numberWithFloat: rotationAngle ]; 
rotationAnimation.duration = duration; 
rotationAnimation.cumulative = YES; 
rotationAnimation.removedOnCompletion = NO; 
rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
rotationAnimation.fillMode = kCAFillModeForwards; 
rotationAnimation.delegate = self; 

[self.view.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 

Làm thế nào tôi có thể ngừng 's UIView luân chuyển ngay nó ở đâu, khi nó chạm vào? Tôi biết làm thế nào để quản lý một phần cảm ứng, nhưng tôi không thể tìm ra cách để ngăn chặn quan điểm ở góc hiện tại của hoạt hình.

Giải pháp: Tôi giải quyết được vấn đề bằng cách lấy góc của lớp trình bày, xóa hoạt ảnh và đặt biến đổi của chế độ xem. Dưới đây là các mã:

[self.view.layer removeAllAnimations];  
CALayer* presentLayer = self.view.layer.presentationLayer; 
float currentAngle = [(NSNumber *)[presentLayer valueForKeyPath:@"transform.rotation.z"] floatValue]; 
self.view.transform = CGAffineTransformMakeRotation(currentAngle); 
+1

bạn đã đặt giải pháp ở trên ở đâu? Tôi luôn nhận được góc 0.0000 – Hisenberg

Trả lời

15

Câu hỏi hay! Đối với điều này, thật hữu ích khi biết kiến ​​trúc Core Animation.

Nếu bạn xem biểu đồ trong số Core Animation Programming Guide mô tả Kiến trúc hiển thị hình ảnh động, bạn có thể thấy có ba cây.

Bạn có cây mô hình. Đó là nơi bạn đặt các giá trị của những gì bạn muốn xảy ra. Sau đó, có bản trình bày cây. Đó là những gì xảy ra khá nhiều trong thời gian chạy. Sau đó, cuối cùng là làm cho cây. Đó là những gì người dùng nhìn thấy.

Trong trường hợp của bạn, bạn muốn truy vấn giá trị của cây trưng bày .

Thật dễ dàng để thực hiện. Đối với chế độ xem bạn đã đính kèm hoạt ảnh, hãy lấy số layer và cho số layer đó, truy vấn giá trị của presentationLayer. Ví dụ:

CATransform3D myTransform = [(CALayer*)[self.view.layer presentationLayer] transform]; 

Không có cách nào để "tạm dừng" hoạt ảnh giữa dòng. Tất cả những gì bạn có thể làm là truy vấn các giá trị, loại bỏ nó, và sau đó tạo lại nó từ nơi bạn rời đi.

Đó là một chút đau!

Hãy xem một số bài đăng khác của tôi nơi tôi đi sâu vào chi tiết này một chút, ví dụ:

Restoring animation where it left off when app resumes from background

Đừng quên cũng là khi bạn thêm một hình ảnh động để lớp một của xem, bạn không thực sự thay đổi tính chất quan điểm cơ bản của. Vậy điều gì sẽ xảy ra?Chúng tôi sẽ có các hiệu ứng lạ khi hoạt ảnh dừng lại và bạn thấy chế độ xem ở vị trí ban đầu.

Đó là nơi bạn cần sử dụng CAAnimation đại biểu. Hãy xem câu trả lời của tôi cho bài đăng này, nơi tôi đề cập đến điều này:

CABasicAnimation rotate returns to original position

+1

Cảm ơn bạn đã giải thích về lớp trình bày. Tôi đã giải quyết vấn đề bằng cách lấy góc quay của presentationLayer với valueForKeyPath :, thiết lập chuyển đổi của khung nhìn và xóa hoạt ảnh. –

5

Bạn cần phải đặt quay đến vòng quay của presentationLayer và sau đó loại bỏ các hình ảnh động từ các lớp. Bạn có thể đọc về lớp bản trình bày trong bài đăng trên blog của tôi về Hit testing animating layers.

Mã để thiết lập quay cuối cùng sẽ là một cái gì đó như:

self.view.layer.transform = [(CALayer*)[self.view.layer presentationLayer] transform]; 
[self.view.layer removeAnimationForKey:@"rotationAnimation"]; 
Các vấn đề liên quan