Không chỉ CGPath
là đục, mà còn CAAnimation
không hỗ trợ bất kỳ cập nhật hoặc thông báo cho hình ảnh động liên tục (tức là sau khi bắt đầu nhưng trước khi hoàn thành). Các thực thể duy nhất có liên quan là hoạt ảnh và CALayer
-s nó được áp dụng cho.
Vì vậy, tùy chọn là:
(một số tùy chọn có vẻ quá đáng sợ nhưng chúng không phải, vì vậy tôi đã thực hiện một dự án ví dụ, xem dưới đây)
repeatCount
Như wj2061 đề cập là his answer bạn có thể tinh chỉnh hoạt ảnh của repeatCount
. Nhược điểm là nó sẽ animate 0,25 thời gian hoạt hình, chứ không phải 0,25 của con đường
CAShapeLayer
Nếu, bởi bất kỳ cơ hội, bạn có thể đại diện cho phân khúc ticker
với CAShapeLayer
của bạn thì bạn có thể làm động strokeStart
và strokeEnd
vì vậy nó sẽ trông giống như phân khúc đang chuyển động dọc theo đường
Clever repeatCount
Bạn tính toán như vậy repeatCount
thể giá trị mà hoạt hình sẽ ngừng tại 0.25 của con đường.
- lấy một số bezier lib
- chiết xuất Bút chì từ chức năng thời gian với
getControlPointAtIndex:
- giải quyết Bút chì để có được "giá trị tiến bộ" của nó (thường là tên
t
) mà giá trị 'y' Bút chì sẽ phù hợp để bạn "cần thiết tiến bộ" 'x' giá trị (0,25)
- tính toán Bút chì cho
t
rằng - đây là giá trị chính xác của repeatCount
bạn cần
Anim ating với CAAnimation, tất cả một mình
loại tiên tiến
- lấy một số bezier lib
- tạo tùy chỉnh CALayer lớp con với bất động sản năng động, chúng ta hãy nói
rideProgress
- add thuộc tính tổng hợp cho con đường bezier (từ Bút chì lib, không phải CGPath) và lớp con (ví dụ:
rideLayer
) để tạo ảnh động
- ghi đè
needsDisplayForKey:
cho rideProgress
và initWithLayer:
cho tất cả các thuộc tính được giới thiệu NHƯNG sử dụng self.rideLayer?.presentationLayer()
thay vì sao chép rideLayer
- ghi đè một trong các cách sau:
drawInContext:
và vẽ những gì bạn cần trong đó; hoặc (tốt hơn) display
, trong display
truy xuất giá trị rideProgress
hiện tại từ presentationLayer
và cập nhật lớp con, sau đó gọi siêu. Dù bằng cách nào, sử dụng Bút chì lib để tính toán vị trí và luân chuyển cho lớp con phù hợp với giá trị hiện tại rideProgress
- đừng quên
CATransaction.setDisableActions(true)
trước khi thiết lập bất cứ tài sản animatable của bất kỳ lớp
- cuối cùng, sử dụng bất kỳ loại CAAnimation hoặc hình ảnh động ngầm trên
rideProgress
tài sản
Chia đường
Một lần nữa, được đề xuất bởi wj2061. Bạn có thể chia con đường để một trong nửa sẽ đại diện cho 0,25 của gốc
Here là ví dụ thực hiện tất cả mọi thứ trên TRỪ "Split path". Tôi đã không chạy bất kỳ bài kiểm tra thực địa trên mã này, nó chỉ là một khái niệm làm việc. XCode 7.3.1, Swift.
Vật liệu sử dụng: Wiki on Cubic function, Great article about operations on beziers, Cubic equations solving method line-by-line
Nguồn
2016-05-20 03:33:26
Vấn đề với điều này là hoạt ảnh sẽ không dừng lại 1/4 theo cách thông qua * đường dẫn *, chỉ có 1/4 đường đi qua * hoạt ảnh *. Do đó với hàm thời gian 'kCAMediaTimingFunctionEaseInEaseOut' và 0,25 cho' repeatCount', hoạt ảnh sẽ ngừng sớm hơn mong đợi. Hơn nữa, chức năng định thời sẽ vẫn được áp dụng cho toàn bộ thời gian hoạt ảnh - và do đó nó sẽ xuất hiện để tăng tốc và sau đó đột nhiên dừng lại, có thể hoặc không thể là những gì OP muốn. – Hamish
@ originaluser2, bạn là chính xác. Tôi thấy các hình ảnh động dừng lại không hoàn hảo, nơi tôi nghĩ rằng nó sẽ, vì vậy điều này giải thích nó! Cảm ơn! Tôi đang tìm 1/4 đường đi, không phải là hoạt hình. –