2012-04-15 16 views
7

Tôi đã tạo 2 NSAnimation đối tượng lật chế độ xem với chế độ xem khác. Tôi muốn chạy 2 hình động này cùng một lúc. Tôi không thể sử dụng NSViewAnimation vì giờ đây nó đang hoạt ảnh bất kỳ thuộc tính chế độ xem nào.có cách nào để chạy đồng thời 2 đối tượng NSAnimation không?

Đây là việc tạo ra hình ảnh động:

self.animation = [[[TransitionAnimation alloc] initWithDuration:1.0 animationCurve:NSAnimationEaseInOut] autorelease]; 
[self.animation setDelegate:delegate]; 
[self.animation setCurrentProgress:0.0]; 

[self.animation startAnimation]; 

Tôi cố gắng để liên kết 2 hình ảnh động, nhưng có lẽ nó đã không làm việc vì một lý do. Tôi lấy một ví dụ từ: Apple developer site

cấu hình đối tượng NSAnimation sử dụng NSAnimationNonblocking không hiển thị bất kỳ hình ảnh động ở tất cả các ...

EDIT: Bộ phim hoạt hình thứ hai là chính xác giống như là người đầu tiên và tạo ra trong cùng một nơi đầu tiên được tạo ra.

TransitionAnimation là một lớp con của NSAnimation, nơi setCurrentProgress trông như thế:

- (void)setCurrentProgress:(NSAnimationProgress)progress { 
    [super setCurrentProgress:progress]; 
    [(NSView *)[self delegate] display];  
} 

các delegateNSView trong trường hợp này, mà trong chức năng drawRect của nó được áp dụng trong một thời gian phụ thuộc vào CIFilter trên CIImage. Vấn đề là nó chạy đồng bộ và hoạt ảnh thứ hai bắt đầu ngay sau khi kết thúc đầu tiên. Có cách nào để chạy chúng đồng thời không?

+1

Hoạt ảnh thứ hai ở đâu? Và theo cách nào mọi thứ không hoạt động? –

Trả lời

17

NSAnimation không thực sự là lựa chọn tốt nhất để tạo hoạt ảnh cho nhiều đối tượng và thuộc tính của chúng cùng một lúc.

Thay vào đó, bạn nên đặt chế độ xem của mình tuân theo giao thức NSAnimatablePropertyContainer.

Sau đó bạn có thể thiết lập nhiều thuộc tính tùy chỉnh như animatable (ngoài các thuộc tính đã được hỗ trợ bởi NSView), và sau đó bạn chỉ có thể sử dụng animator Proxy quan điểm của bạn để animate các thuộc tính:

yourObject.animator.propertyName = finalPropertyValue; 

Ngoài từ làm hoạt hình rất đơn giản, nó cũng cho phép bạn tạo hoạt động nhiều đối tượng cùng một lúc sử dụng một NSAnimationContext:

[NSAnimationContext beginGrouping]; 
firstObject.animator.propertyName = finalPropertyValue1; 
secondObject.animator.propertyName = finalPropertyValue2; 
[NSAnimationContext endGrouping]; 

bạn cũng có thể thiết lập thời gian và cung cấp một blo xử lý hoàn ck:

[NSAnimationContext beginGrouping]; 
[[NSAnimationContext currentContext] setDuration:0.5]; 
[[NSAnimationContext currentContext] setCompletionHandler:^{ 
    NSLog(@"animation finished"); 
}]; 
firstObject.animator.propertyName = finalPropertyValue1; 
secondObject.animator.propertyName = finalPropertyValue2; 
[NSAnimationContext endGrouping]; 

Các NSAnimationNSViewAnimation lớp lớn tuổi hơn nhiều so với sự hỗ trợ làm phim hoạt hình proxy và tôi rất khuyên bạn nên di chuyển ra khỏi họ nếu có thể. Hỗ trợ giao thức NSAnimatablePropertyContainernhiều hơn đơn giản hơn việc quản lý tất cả các công cụ đại biểu NSAnimation. Sự hỗ trợ của Lion cho các chức năng định thời gian và các trình xử lý hoàn thành có nghĩa là thực sự không cần phải làm điều đó nữa.

Đối với một đối tượng tiêu chuẩn NSView, nếu bạn muốn thêm hỗ trợ hình ảnh động để một tài sản theo quan điểm của bạn, bạn chỉ cần ghi đè lên các phương pháp +defaultAnimationForKey: theo quan điểm của bạn và trả lại một hình ảnh động cho bất động sản:

//declare the default animations for any keys we want to animate 
+ (id)defaultAnimationForKey:(NSString *)key 
{ 
    //in this case, we want to add animation for our x and y keys 
    if ([key isEqualToString:@"x"] || [key isEqualToString:@"y"]) { 
     return [CABasicAnimation animation]; 
    } else { 
     // Defer to super's implementation for any keys we don't specifically handle. 
     return [super defaultAnimationForKey:key]; 
    } 
} 

Tôi đã tạo một sample project đơn giản cho biết cách tạo hiệu ứng đồng thời nhiều thuộc tính của một chế độ xem bằng cách sử dụng giao thức NSAnimatablePropertyContainer.

Tất cả các chế độ xem của bạn cần làm để cập nhật thành công là đảm bảo rằng setNeedsDisplay:YES được gọi khi bất kỳ thuộc tính hoạt hình nào được sửa đổi. Sau đó, bạn có thể nhận được các giá trị của các thuộc tính đó trong phương thức drawRect: và cập nhật hình động dựa trên các giá trị đó.

Nếu bạn muốn có một giá trị tiến bộ đơn giản mà là tương tự như cách mà mọi thứ làm việc với NSAnimation, bạn có thể xác định một tài sản trên quan điểm của bạn progress và sau đó làm một cái gì đó như thế này:

yourView.progress = 0; 
[yourView.animator setProgress:1.0]; 

Sau đó bạn có thể truy cập self.progress trong phương thức drawRect: để tìm giá trị hiện tại của hoạt ảnh.

+0

Cảm ơn rất nhiều! Tôi đã không nhận thức được điều này. Bằng cách nào đó tôi đã không đạt được nó trong tìm kiếm google. Sẽ thử nó và cho bạn biết. –

+0

Tôi chỉ tò mò: Nếu chúng tôi đang gặp vấn đề về hiệu năng (tốc độ khung hình thấp) với NSAnimation, việc áp dụng giao thức này có thể giúp ích không? – Zakman411

+0

Điều đó phụ thuộc vào những gì gây ra tốc độ khung hình thấp. Proxy hoạt hình không phải là một viên đạn ma thuật và sẽ vẫn thu hút lượt xem của bạn, vì vậy nếu bản vẽ/tổng hợp chậm thì việc chuyển sang công nghệ này sẽ không tạo ra nhiều khác biệt. Có nhiều khả năng là bạn sẽ cần sử dụng công nghệ hiển thị hiệu suất cao hơn, chẳng hạn như Hoạt ảnh cốt lõi, được thiết kế đặc biệt để hiển thị hình ảnh động trơn tru. –

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