2008-10-28 14 views
8

Core Animation cho phép hình ảnh động tùy chỉnh bằng cách thực hiện phương pháp actionForKey trong CALayer dựa lớp học của bạn:Tôi làm cách nào để sử dụng hoạt ảnh tùy chỉnh cho onOrderOut trong Hoạt ảnh chính?

- (id<CAAction>)actionForKey:(NSString *)key { 
    // Custom animations 
    return [super actionForKey:key]; 
} 

Sau đó tôi có thể tạo ra một hình ảnh động và gửi lại cho hành động onOrderIn (tức là khi lớp được thêm vào lớp khác) . Điều này hoạt động tốt. Nếu tôi làm tương tự cho onOrderOut (nghĩa là lớp được xóa khỏi lớp phủ của nó), hoạt ảnh trả về bị bỏ qua và hoạt ảnh mặc định được áp dụng thay thế.

Mục tiêu của tôi là để phóng to lớp trong (onOrderIn) và ra (onOrderOut):

- (id<CAAction>)actionForKey:(NSString *)key { 

    if ([key isEqualToString:@"onOrderIn"] || [key isEqualToString:@"onOrderOut"]) { 
     CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
     a.duration = 0.25; 
     a.removedOnCompletion = NO; 
     a.fillMode = kCAFillModeBoth; 

     if ([key isEqualToString:@"onOrderIn"]) { 
      a.fromValue = [NSNumber numberWithFloat:0.0]; 
      a.toValue = [NSNumber numberWithFloat:1.0]; 
     } else { 
      a.fromValue = [NSNumber numberWithFloat:1.0]; 
      a.toValue = [NSNumber numberWithFloat:0.0]; 
     } 

     return a; 
    } 

    return [super actionForKey:key]; 
} 

Phóng to công trình, thu nhỏ không. Thay vào đó, hoạt ảnh mờ dần mặc định được sử dụng.

Mã có thể chứa một số lỗi chính tả, vì tôi đang nhập mã này trên một máy khác.

Có ai giúp được không?

Trả lời

4

Trích dẫn John Harper trên quartz-dev mailing list:

Có một vấn đề cơ bản với trả lại bất kỳ hình ảnh động cho onOrderOut khóa bởi thời điểm hoạt hình nên chạy, lớp không còn trong cây , vì vậy nó không có hiệu lực . Vì vậy, onOrderOut không hữu ích để kích hoạt hoạt ảnh; có thể là hữu ích khi chạy mã khác khi các lớp bị xóa khỏi cây.

Giải pháp tốt nhất mà tôi đã tìm thấy cho này (giả sử quá trình chuyển đổi phai mặc định trên phụ huynh không phải là những gì bạn muốn, mà nó thường là không) là thêm tùy chỉnh hình ảnh động để áp dụng hiệu ứng loại bỏ bạn muốn, sau đó, trong đại biểu hoạt ảnh didStop , thực sự xóa lớp. Nó thường thuận tiện để tạo một nhóm duy nhất của hình ảnh động với các thiết lập bất động sản đại biểu, và fillMode = chuyển tiếp, removedOnCompletion = NO để bạn có thể loại bỏ các lớp vào cuối của hoạt hình không có khả năng của lớp vẫn hiển thị trong trạng thái bình thường .

Nếu bạn làm nhiều trường hợp này, nó rất dễ dàng để viết một lớp cha phổ biến mà bắt đầu một hình ảnh động, đặt các đại biểu hoạt hình đến lớp và dụng cụ + animationDidStop: để loại bỏ các lớp w/o hoạt hình được kích hoạt. Điều này khôi phục tính chất lửa và quên của CoreAnimation mà bạn đã hy vọng sẽ có mặt với việc thực hiện mặc định.

+0

Ah, cảm ơn bạn.Tôi sẽ kiểm tra điều này nếu tôi cần nó một lần nữa, trong khi đó chúng tôi đã viết một phiên bản hoàn toàn khác của phần mềm với Qt Jambi. ;) – Lemming

0

Bạn đã xác minh rằng phương pháp của mình đang được gọi với key@"onOrderOut" và phương pháp của bạn đang trả lại hình động đúng?

+0

Có. Trong mã thực tế tôi lần đầu tiên gọi NSLog với tên của hành động và thực sự, onOrderOut được yêu cầu. Tôi cũng đảm bảo rằng các hình ảnh động được tạo ra và trả về, nhưng vẫn còn, nó chỉ bị bỏ qua. – Lemming