2011-01-20 20 views
22

Mọi người và mọi cuốn sách đều tuyên bố rằng có những hoạt ảnh ngầm xuất hiện trong CALayer. Tuy nhiên, mỗi khi tôi muốn xác minh rằng cho đến nay, tôi kết thúc với một khó khăn với giá trị thiết lập. Không có hoạt hình nào cả.Khi nào các hoạt ảnh ngầm định diễn ra trong iOS?

Đây là một ví dụ trong một dự án không có gì khác đang xảy ra. Tất cả những gì tôi làm là tạo ra một khung nhìn, sau đó lấy nó là cá thể CALayer và làm một cái gì đó mà nên được hoạt hình ngầm.

[theLayer setValue:[NSNumber numberWithFloat:M_PI * 1.1] forKeyPath:@"transform.rotation.z"]; 

Một số khác:

CGRect currentBounds = theLayer.bounds; 
currentBounds.size.width += 120.f; 
[self.animatedLayer setBounds:currentBounds]; 

Quan điểm chứa một số nội dung tất nhiên vì vậy tôi có thể thấy sự thay đổi. Tôi thấy thay đổi trực quan, nhưng dưới dạng khó chụp. Không có hoạt hình nào cả.

Vì vậy, tất cả các sách đó đều sai và có kiến ​​thức cũ về Mac OS X khi viết về Hoạt ảnh chính và hoạt ảnh ngầm, hoặc tôi đang làm điều gì sai. Bất cứ ai có thể cung cấp một ví dụ làm việc thể hiện hoạt hình ngầm trên iPhone?

Trả lời

65

UIKit vô hiệu hóa hoạt ảnh ngầm. Để cụ thể hơn, một CALayer được liên kết với UIView sẽ không bao giờ ngầm sinh động. CALayers mà bạn tạo ra chính mình và không được liên kết với một UIView sẽ mua vào máy móc hoạt hình ngầm ẩn.

Nếu bạn quan tâm đến cách hoạt động, hoạt ảnh ngầm sẽ diễn ra sau khi tìm kiếm -actionForKey bình thường:. Nếu có một CAAction cho một thuộc tính đã cho, nó được sử dụng. Nếu không, hoạt ảnh ngầm sẽ được sử dụng. Trong trường hợp một CALayer được liên kết với UIView, UIView triển khai phương thức ủy quyền -actionForLayer:forKey: và khi không ở trong khối hoạt ảnh UIView, nó luôn trả về [NSNull null] để biểu thị rằng tra cứu hành động sẽ dừng ở đây. Điều này ngăn cản hoạt ảnh tiềm ẩn hoạt động. Bên trong khối hoạt ảnh UIView, nó xây dựng hành động riêng của mình để thể hiện cài đặt hoạt ảnh UIView hiện tại. Một lần nữa, điều này ngăn cản hoạt ảnh ngầm.

Nếu bạn cần tạo hiệu ứng thuộc tính CALayer mà UIView sẽ không làm cho bạn, bạn có thể sử dụng lớp con CAAnimation rõ ràng (chẳng hạn như CABasicAnimation).

+1

Câu trả lời hay! Tôi tò mò - bạn đã lấy tất cả thông tin chi tiết ở đâu? Tôi đã kiểm tra rất nhiều sách và nguồn nhưng họ thiếu những chi tiết này. –

+0

Chủ yếu là dùng thử và báo lỗi. Nếu bạn ghi đè '-actionForLayer: forKey:' trên một lớp con UIView, bạn có thể đăng xuất kết quả của cuộc gọi đến siêu và tương quan với việc liệu có một khối hoạt ảnh động hay không. Nó cũng có ý nghĩa nếu bạn nghĩ về nó - UIView là đại biểu của CALayer, và '-actionForLayer: forKey:' là nơi thích hợp để nối vào nếu bạn muốn vô hiệu hóa các hoạt ảnh ngầm định. –

+0

Làm cho rất nhiều ý nghĩa. Cảm ơn! –

0

Bạn cũng có thể đặt đại biểu của lớp cho đối tượng của riêng bạn và xử lý -actionForLayer: forKey :. Dường như bạn có được hoạt ảnh ngầm ngay cả khi đại biểu không triển khai -actionForLayer: forKey :.

2

Bài đăng cũ, nhưng liên kết bên dưới trỏ đến một phần trong Hướng dẫn lập trình hoạt ảnh chính giúp làm sáng tỏ thêm về những gì Kevin Ballard đang nói. Có thực sự cần phải là một lưu ý trắng trợn mà đề cập rằng để animate một thuộc tính lớp cơ bản của UIView bạn cần phải đảm bảo rằng bạn thiết lập các đại biểu của lớp để một thể hiện mà sẽ áp dụng các "actionForLayer: ForKey:" phương pháp và trở về nil. Nó đã được tìm thấy rằng bạn cũng có thể thiết lập các đại biểu cho một trường hợp không áp dụng phương pháp này và nó vẫn cho phép hình ảnh động ngầm, nhưng đây là một thực hành cẩu thả và khó hiểu.

Core Animation - Layer Actions - Defined Search Pattern for Action Keys

1

Hãy ghi nhớ rằng lớp con của lớp chính của một UIView thường không có UIView như đại biểu của họ. Do đó, họ tham gia vào hoạt ảnh ngầm trừ khi bạn chặn rõ ràng điều này, ngay cả khi bạn chưa cung cấp cho một đại biểu trả về một hành động nil để trả lời actionForLayer: forKey :.

Vì vậy, một cách đơn giản để tải hoạt ảnh ngầm trong chế độ xem chung là chỉ cần thêm lớp con bao phủ lớp chính.

Sách của Matt Neuberg Lập trình iOS 5 (hiện đang trong giai đoạn thử nghiệm trên Safari Books Online) giải thích chủ đề này rất sáng suốt.

1

Đó chính xác là câu trả lời của Kevin Ballard. Tôi muốn cung cấp một cái gì đó ở đây.

Các thông tin chi tiết từ official document

Có một phần gọi là: Quy định cho Sửa đổi Layer trong iOS, và bạn sẽ tìm thấy

Lớp UIView vô hiệu hóa hình ảnh động lớp theo mặc định nhưng reenables họ trong phim hoạt hình khối.

Ngoại trừ bật ẩn trong khối hoạt ảnh UIView. Có hai giải pháp khác:

  1. Tạo lớp bạn cần làm hoạt ảnh lớp con của chế độ xem. Tham khảo [câu trả lời] [2]

    [2]: Implicit property animations do not work with CAReplicatorLayer? của hoạt ảnh ngầm định mờ dần không hoạt động. Tôi đã thử điều này, nó hoạt động như mong đợi.

  2. gán ủy nhiệm của lớp cho chính lớp đó. Lớp mặc định của lớp trong iOS là chế độ xem cửa hàng sao lưu của nó, thực hiện lớp actionForLayer: (id) cho khóa: (NSString *) và trả về [NSNull null] để tắt hoạt ảnh ngầm của lớp.
0

thực sự, bạn chỉ có thể trả về nil để nhận hoạt ảnh mặc định của CALay.

  • (id) actionForLayer: (CALayer *) layer forKey: (NSString *) event { return nil; }
+0

/* Nếu được xác định, được gọi bằng cách thực hiện mặc định phương thức * -actionForKey :. Nên trả về một đối tượng đang triển khai giao thức * CAAction. Có thể trả lại 'nil' nếu đại biểu không chỉ định * một hành vi cho sự kiện hiện tại.Trả về đối tượng null (tức là * '[NSNull null]') rõ ràng buộc không tìm kiếm thêm. (Tức là phương thức * + defaultActionForKey: sẽ không được gọi.) * / – dongxin

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