2010-03-25 49 views
5

Tôi bắt đầu học cách sử dụng hoạt ảnh UIView. Vì vậy, tôi đã viết các dòng sau:setAnimationRepeatCác máy chủ không hoạt động như tôi mong đợi

[UIView beginAnimations:nil context:NULL]; 

[UIView setAnimationDuration:2.0]; 
[UIView setAnimationRepeatCount:2]; 
[UIView setAnimationRepeatAutoreverses:YES]; 

CGPoint position = greenView.center; 
position.y = position.y + 100.0f; 
position.x = position.x + 100.0f; 
greenView.center = position; 

[UIView commitAnimations]; 

Trong trường hợp này, UIView (một hộp màu xanh lá cây) được chuyển trở lại và tạm thời 2 lần. Cho đến nay rất tốt, NHƯNG tôi phát hiện ra rằng sau khi di chuyển hai lần, hộp màu xanh lá cây đã kết thúc nhảy lên "vị trí mới" (position.x + 100.0f, position.y + 100.0f) thay vì quay trở lại vị trí ban đầu (position.x, position.y). Điều đó làm cho hình ảnh động trông khá kỳ lạ (như sau khi hộp xoay trở lại vị trí ban đầu gây ra bởi setAnimationRepeatAutoreverses, nó nhảy trở lại vị trí mới trong micro giây cuối cùng!)

Cách tốt nhất để làm cho hộp màu xanh lá cây KHÔNG nhảy đến vị trí mới vào phút cuối cùng?

Trả lời

1

Tôi đã có chính xác cùng một vấn đề với việc sử dụng hoạt ảnh UIView trên thuộc tính alpha. Phần tồi tệ nhất là hoạt ảnh nhảy đến vị trí "cuối cùng" trước hoạt ảnhDidStop: thông báo ủy nhiệm được gửi đi, điều đó có nghĩa là bạn không thể đặt trạng thái ban đầu ở đó theo cách thủ công.

Giải pháp của tôi là sử dụng các thông điệp animationDidStop đại biểu để tạo ra một khối hoạt hình mới, và chuỗi chúng lại với nhau:

- (void)performAnimation 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(phase1AnimationDidStop:finished:context:)]; 

    // Do phase 1 of your animations here 
    CGPoint center = someView.center; 
    center.x += 100.0; 
    center.y += 100.0; 
    someView.center = center; 

    [UIView commitAnimations]; 
} 

- (void)phase1AnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(phase2AnimationDidStop:finished:context:)]; 

    // Do phase 2 of your animations here 
    CGPoint center = someView.center; 
    center.x -= 100.0; 
    center.y -= 100.0; 
    someView.center = center; 

    [UIView commitAnimations]; 
} 

- (void)phase2AnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{ 
    // Perform cleanup (if necessary) 
} 

Bạn có thể chuỗi với nhau như nhiều khối hình ảnh động như bạn muốn theo cách này. Nó có vẻ lãng phí mã khôn ngoan, nhưng cho đến khi Apple cung cấp cho chúng tôi một tài sản - [UIView setAnimationFinishesInOriginalState:] hoặc một cái gì đó tương tự, đây là cách duy nhất mà tôi đã tìm thấy để giải quyết vấn đề này.

+0

Thực ra, nếu tôi trực tiếp theo dõi mã của bạn, chế độ xem sẽ liên tục bay về phía góc trên bên trái. Chúng tôi không thực sự cần tạo hoạt ảnh. Chỉ cần -100 cho cả x và y của trung tâm là đủ. – user222292

+0

Tôi không chắc chắn ý của bạn là gì - bạn có thể làm rõ điều gì sai với mã tôi đã cung cấp không? –

2

Tôi tìm hiểu bằng cách sử dụng số chẵn cho setAnimationDuration sẽ kết thúc hoạt ảnh lặp lại về vị trí ban đầu và sau đó bật đến vị trí cuối cùng sau khi hoạt ảnh lặp lại kết thúc. Nếu tôi đặt setAnimationDuration thành một nửa chu kỳ thì hoạt ảnh lặp lại sẽ kết thúc đến vị trí cuối cùng. Đây là một cách sạch hơn để xử lý hình ảnh động hơn là sử dụng phương thức setAnimationDidStopSelector:.

// Repeat Swimming 
CGPoint position = swimmingFish.center; 
position.y = position.y - 100.0f; 
position.x = position.x - 100.0f; 

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:1.0f]; 
[UIView setAnimationRepeatCount:2.5]; 
[UIView setAnimationRepeatAutoreverses:YES]; 

swimmingFish.center = position; 
+0

Tôi đã sử dụng 2.1f và có vẻ ổn với tôi .. – Sam

+1

Điều này không hiệu quả đối với tôi (XCode 4.5.2 và iOS6). – Alex

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