2013-03-23 28 views
7

Tôi đang cố gắng để thực hiện một "dịch" chính xác của UIView mã hoạt hình khối này dựa trên:Animate khung tài sản sử dụng CABasicAnimation

[UIView animateWithDuration:0.5 
         delay:0.0 
        options:UIViewAnimationOptionCurveEaseInOut 
       animations:^{ 
           someView.frame = CGRect(0, 100, 200, 200); 
          } 
       completion:nil]; 

sử dụng CABasicAnimation để thay thế.

Tôi hoàn toàn nhận thức được rằng tài sản khung thực sự là một sự kết hợp của vị trí, vọtanchorPoint của lớp cơ bản, như được mô tả ở đây: http://developer.apple.com/library/mac/#qa/qa1620/_index.html
... và tôi đã thực hiện một giải pháp như vậy, sử dụng hai CABasicAnimations một cài đặt vị trí, một cho giới hạn và nó hoạt động cho một chế độ xem đó.

Tuy nhiên, vấn đề là tôi có các bản xem trước bên trong chế độ xem của mình. someView có một chế độ xem phụ thuộc loại UIScrollView trong đó tôi đặt một chế độ xem phụ khác là loại UIImageView. UIScrollView subview có autoresizingMask được đặt thành UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight. Tất cả đều hoạt động hoàn hảo nếu tôi sử dụng phiên bản dựa trên khối UIView, tuy nhiên khi tôi thử sử dụng CABasicAnimations, các bản xem trước bắt đầu hoạt động không mong muốn (nghĩa là được đổi kích thước thành độ rộng không chính xác). Vì vậy, có vẻ như autoresizingMask không hoạt động chính xác khi sử dụng CABasicAnimations. Tôi cũng nhận thấy rằng các cuộc phỏng vấn không nhận được cuộc gọi đến setFrame:, mặc dù thuộc tính khung của chế độ xem gốc sẽ thay đổi sau khi thay đổi vị trí lớp và giới hạn được thực hiện.

Đó là lý do tôi muốn biết những gì sẽ là mã chính xác để tái tạo với CABasicAnimation rằng những gì đang xảy ra khi một người sử dụng animateWithDuration phương pháp UIView của.

Trả lời

11

Tôi hoàn toàn nhận thức được rằng tài sản khung thực sự là một sự kết hợp của vị trí, giới hạn và anchorPoint của lớp cơ bản

tốt, nhưng điều quan trọng cũng phải nhận thức được là rằng frame không phải là một animatable tài sản cho các lớp. Nếu bạn muốn tạo hiệu ứng động bằng CABasicAnimation, bạn phải sử dụng các thuộc tính có khả năng hoạt hình cho các lớp. Tài liệu CALayer đánh dấu mọi thuộc tính như vậy là rõ ràng "có thể hoạt hình". Ý tưởng sử dụng boundsposition là chính xác.

Như vậy, mã này không thực chất những gì bạn đã làm trước đây:

[CATransaction setDisableActions:YES]; 
// set final bounds and position 
v.layer.bounds = CGRectMake(0,0,200,200); 
v.layer.position = CGPointMake(100,200); 

// cause those changes to be animated 
CABasicAnimation* a1 = [CABasicAnimation animationWithKeyPath:@"bounds"]; 
a1.duration = 0.5; 
CABasicAnimation* a2 = [CABasicAnimation animationWithKeyPath:@"position"]; 
a2.duration = 0.5; 
[v.layer addAnimation:a1 forKey:nil]; 
[v.layer addAnimation:a2 forKey:nil]; 

Tuy nhiên, mã mà không ảnh hưởng đến kích thước của bất kỳ lớp con của v.layer. (Một subview của v được vẽ bởi một sublayer của v.layer.) Điều đó, thật không may, là vấn đề bạn đang cố gắng giải quyết. Tôi tin rằng bằng cách giảm xuống cấp độ của lớp và trực tiếp hoạt hình cốt lõi rõ ràng, bạn đã từ bỏ tự động hóa, điều này xảy ra ở cấp chế độ xem.Vì vậy, bạn sẽ cần phải animate các sublayers là tốt. Đó là những gì hoạt hình xem đang làm cho bạn.

Đây là tính năng không may của iOS. Mac OS X có các ràng buộc lớp (CAConstraint) làm ở cấp lớp những gì autoresizing hiện ở cấp độ xem (và nhiều hơn nữa). Nhưng iOS thiếu tính năng đó.

+0

Có, tôi đã tạo hai CABasicAnimations một cho KeyPath @ "position", một cái khác cho @ "bounds". Tôi đã thiết lập cá nhân của họ từValue và toValue. Sau đó, tôi đã tạo một CAAnimationGroup và thêm hai hình động này vào nó, sau đó tôi thêm hoạt hình nhóm vào lớp đó. Cuối cùng, tôi đặt someView.layer.bounds và someView.layer.position vào các giá trị mong muốn mới (được sử dụng trong toValue) để thay đổi thực sự tồn tại trong cây lớp mô hình. –

+0

Hoạt ảnh hoạt động với someView, đây là chế độ xem chính (phụ huynh) có chứa các bản xem phụ khác. Vấn đề là các subviews không được thay đổi kích cỡ, chúng giữ nguyên chiều rộng của chúng như thể có vấn đề với autoresizingMask (được đặt trên chúng). Tất cả đều hoạt động khi sử dụng UIView animateWithDuration: tuy nhiên tôi muốn sử dụng CABasicAnimations vì tôi cần thêm các tùy chọn cấu hình ... –

+2

Tôi đang ở bên bạn. Tôi tin rằng bởi vì bạn đang làm động trực tiếp lớp, bạn sẽ phải quản lý hoạt ảnh của các lớp con theo cách thủ công. – matt

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