2010-04-01 32 views

Trả lời

15

Có một vài cách khác nhau để giải quyết vấn đề này. Yêu thích của tôi là đặt đối tượng ở cuối hoạt ảnh và sử dụng từValue thay vì toValue để tạo hoạt ảnh. Bạn cũng có thể đặt cả hai từValue và toValue để tạo hiệu ứng này. tức là

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; 
animation.duration = 1.0; 
animation.fromValue = [NSValue valueWithCGPoint:startPoint]; 
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; 

viewToAnimate.center = endPoint; 
[viewToAnimate.layer addAnimation:animation forKey:@"slide"]; 

Một cách khác để làm điều này là để thiết lập mình như các đại biểu và thực hiện:

+0

Tuyệt vời. nó hoạt động cho tôi, cảm ơn rất nhiều –

+1

ở đây, giá trị của "nới lỏng" là gì ?. – sathiamoorthy

+0

Tôi tin rằng nếu easing không được thiết lập nó preloads để Linear, nhưng nó phải được đơn giản để thêm nó vào nếu bạn đang tìm kiếm dễ dàng trong/dễ dàng ra hoặc dễ dàng vào/ra. –

8

Bạn cần phải thiết lập vị trí cuối cùng. Nếu bạn chỉ sử dụng hoạt ảnh từValue và toValue, nó sẽ quay trở lại điểm xuất phát ban đầu. Hoạt ảnh sử dụng bản sao của chế độ xem/lớp khi nó "phát" và sau đó hoạt ảnh sẽ hiển thị chế độ xem/lớp gốc khi nó kết thúc.

Nếu bạn không đặt nó rõ ràng, nó sẽ xuất hiện để chụp lại, mặc dù chế độ xem/lớp chưa bao giờ thực sự di chuyển.

startPoint và endPoint là CGPoints và myView là UIView đang hoạt ảnh.

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; 
    animation.duration = .3; 
    animation.fromValue = [NSValue valueWithCGPoint:startPoint]; 
    animation.toValue = [NSValue valueWithCGPoint:endPoint]; 
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
    [myView.layer addAnimation:animation forKey:@"position"]; 
    myView.layer.position = endPoint; // Must set end position, otherwise it jumps back 
+1

Ngoài ra, đừng quên đặt ** loại bỏ ** Hoàn thành ** tài sản của hoạt ảnh thành ** NO ** 'hoạt hình.removedOnCompletion = NO;' – krpec

0

Nếu bạn xem tài liệu để thêmHình động: forKey :, thông báo 'Thông thường điều này được ngầm gọi'. Nói cách khác, bạn không nên gọi nó trực tiếp. Bạn đang thực sự có nghĩa là để làm những việc sau thay vào đó, mà thậm chí còn dễ dàng hơn thiết từ và đến các giá trị, bạn chỉ cần thiết lập các giá trị trực tiếp trên lớp:

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
animation.duration = .3; 

myLayer.actions = @{@"opacity": animation}; 
myLayer.opacity = 0; 

này sẽ mờ dần một lớp để zero opacity.

+0

Tôi không thấy điều đó trong tài liệu, có thể đó là một điều OSX chỉ có? Tôi đang xem CALayer [ở đây] (https://developer.apple.com/library/ios/documentation/graphicsimaging/reference/CALayer_class/Introduction/Introduction.html#//apple_ref/occ/instm/CALayer/addAnimation: forKey :). Hầu hết các hướng dẫn của Apple đều bao gồm lệnh gọi 'addAnimation: forKey:' ví dụ: [tại đây] (https://developer.apple.com/library/ios/documentation/cocoa/conceptual/coreanimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html). – bcattle

3

Để thiết lập các đối tượng ở phần cuối của các hình ảnh động chỉ cần viết code như thế này

#import <QuartzCore/QuartzCore.h> 

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; 
animation.duration = 1.0; 
animation.fromValue = [NSValue valueWithCGPoint:startPoint]; 
animation.timingFunction = [CAMediaTimingFunction functionWithName:easing]; 
animation.fillMode = kCAFillModeForwards; // This line will stop the animation at the end position of animation 
animation.autoreverses = NO; 

viewToAnimate.center = endPoint; 
[viewToAnimate.layer addAnimation:animation forKey:@"slide"]; 
+1

không hoạt động đối với tôi –

1

Bạn chỉ có thể thiết lập removedOnCompletion để NO nếu bạn muốn giữ giá trị cuối cùng. Và đừng quên đặt fillMode.

animation.fillMode = kCAFillModeForwards; //The receiver remains visible in its final state when the animation is completed. 
animation.removedOnCompletion = NO; 
Các vấn đề liên quan