2009-07-22 32 views
23

Đối với sự hiểu biết của tôi, beginTime có thể được sử dụng để nói "hey, bắt đầu vào chính xác 12:00 'o đồng hồ". Nhưng làm thế nào tôi sẽ nói điều này với một loại CFTimeInterval? Tôi nghĩ rằng cái này không là gì hơn là một loại "phao" giá trị để xác định giây.Cách chỉ định thời gian bắt đầu cho hoạt ảnh bằng cách sử dụng CFTimeInterval?

Hoặc điều gì khác sẽ là khác biệt với thuộc tính timeOffset được chỉ định trong giao thức CAMediaTiming?

Trả lời

8

Không, đó không phải là những gì mà thời gian bắt đầu thực hiện. Nó chỉ định thời gian bắt đầu tương đối từ hoạt ảnh gốc (theo mặc định, nhiều hoạt ảnh trong một nhóm sẽ kích hoạt cùng một lúc).

Từ documentation:

Chỉ định bắt đầu thời điểm nhận liên quan đến đối tượng cha của nó, nếu có.

timeBắt đầu làm cho nó bắt đầu hoạt ảnh ở khung hình tại thời điểm offSet và khi đến cuối vòng lặp. Nói cách khác, hãy tưởng tượng A, B, C, D, E là những khung hình của hoạt ảnh này là những gì sẽ xảy ra trong các trường hợp khác nhau nếu bạn đặt beginTime hoặc timeOffset thành giá trị bằng với khi bạn nhấn khung C trong trường hợp bình thường.

Normal  |A->B->C->D->E 
beginTime: |  A->B->C->D->E 
timeOffset: |C->D->E->A->B 
+1

Chỉ cần đặt timeOffset không làm chậm hoạt ảnh và thay đổi thời gian ban đầu. Dòng của bạn cho 'timeOffset' thực sự là những gì sẽ xảy ra là bạn đặt 'timeOffset' và 'beginTime' ... phải không? –

+0

Bạn đúng, làm rõ –

+3

Louis, bạn có biết có cách nào để chạy một hoạt ảnh như: Partial: | - - A-> B-> C, vì vậy về cơ bản giống như trường hợp beginTime bạn đã đề cập nhưng có nó dừng lại khi nó được kết thúc thay vì có nó vòng quanh? – pho0

52

gì tôi đã bỏ lỡ trong tài liệu: beginTime là trong "hoạt hình lõi thời gian tuyệt đối", do đó bạn đã để có được thời gian hiện tại và chỉ định bạn bù đắp từ đó:

// Start in 5 seconds 
theAnimation.beginTime = CACurrentMediaTime()+5; 
+3

Thời gian bắt đầu được chỉ định trong không gian thời gian chính, không liên quan đến thời gian tuyệt đối. – an0

+1

@ an0, rõ ràng, trong trường hợp của tôi, không gian thời gian cha mẹ giống hệt với CACurrentMediaTime(), vì vậy nó hoạt động tốt. Làm thế nào bạn sẽ tham khảo không gian thời gian cha mẹ? –

+0

Chúng ta nên sử dụng thời gian hiện tại trong không gian lớp thời gian - không gian thời gian cha mẹ của hình ảnh động trực tiếp thêm vào lớp - làm cơ sở. Nếu beginTime của lớp được đặt thành khác không, mã của bạn sẽ không hoạt động. Xem câu trả lời của tôi để biết chi tiết. – an0

11

Tôi nghĩ rằng tài liệu Giao thức CAMediaTiming rất tệ. Time Warp in Animation là giải thích kỹ lưỡng (tái tài liệu) của tất cả các thuộc tính của Giao thức CamediaTiming.

13

Trước tiên, bạn cần phải chuyển đổi sang timespace của lớp như sau:

let currentLayerTime = myLayer.convertTime(CACurrentMediaTime(), fromLayer: nil) 

Sau đó, bạn có thể thiết lập beginTime liên quan đến thời gian bây giờ của lớp. Ví dụ, để thực hiện một hình ảnh động bắt đầu trong 2s:

myAnimation.beginTime = currentLayerTime + 2 

Bạn cũng sẽ có thể muốn thiết lập 'fillMode' để trở về trước, do đó bạn có thể thiết lập giá trị tài sản cuối cùng trước khi bạn thêm các hình ảnh động:

myAnimation.fillMode = kCAFillModeBackwards 
myLayer.someProperty = someFinalValue 
myLayer.addAnimation(myAnimation, forKey: "myAnimationName") 
Các vấn đề liên quan