2012-06-26 32 views
5

Trong ứng dụng của tôi, tôi đang sử dụng CABasicAnimation cho hoạt ảnh. Tôi muốn thay đổi tốc độ của hoạt ảnh động vì vậy tôi đã thêm một thanh trượt để thay đổi tốc độ. Sau đây là mã hoạt hình của tôi. Nhưng tôi không thể thay đổi tốc độ, khi tôi thay đổi giá trị của tốc độ không có gì xảy ra.Làm thế nào để thay đổi tốc độ trong khi hoạt hình CABasicAnimation

 CABasicAnimation * a = [CABasicAnimation animationWithKeyPath:@"position"]; 
    [a setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]]; 

    CGPoint startPt = CGPointMake(self.view.bounds.size.width + displayLabel.bounds.size.width/2, 
            displayLabel.frame.origin.y); 
    CGPoint endPt = CGPointMake(displayLabel.bounds.size.width/-2, displayLabel.frame.origin.y); 

    [a setFromValue:[NSValue valueWithCGPoint:startPt]]; 
    [a setToValue:[NSValue valueWithCGPoint:endPt]]; 
    [a setAutoreverses:NO]; 
    [a setDuration:speeds]; 
    [a setRepeatCount:HUGE_VAL]; 
    [displayLabel.layer addAnimation:a forKey:@"rotationAnimation"]; 


    - (IBAction)speedSlider:(id)sender { 

     speeds = slider.value; 

    } 
+0

Bản sao có thể có của [Thời lượng thay đổi (tốc độ) trên hoạt ảnh đang chạy] (https://stackoverflow.com/questions/21589483/change-duration-speed-on-a-running-animation) – Fattie

+0

** Giải pháp đầy đủ cho năm 2017 ** ...https://stackoverflow.com/a/45787919/294884, phew – Fattie

Trả lời

0

đặt tốc độ như những gì bạn cần.

a.duration=0.5; 

Hãy thử này ...

+0

Tôi muốn tốc độ động dựa trên giá trị thanh trượt. Hoạt ảnh hoàn toàn tốt cho các giá trị tĩnh –

2

EDIT: Có vẻ như bạn sẽ có một vấn đề nữa, mặc dù: nó không look like bạn có thể thay đổi giá trị như thế trên một hình ảnh động chạy. Bạn sẽ phải xóa hoạt ảnh hiện tại và thêm hoạt ảnh mới có giá trị thay đổi. Điều này có thể cần một chút cẩn thận để ngăn chặn hiệu ứng chói tai khi bạn thêm hoạt ảnh mới.

Từ chuỗi trên, bạn có thể làm điều này bằng cách không lặp lại hoạt ảnh, nhưng bằng cách sử dụng đại biểu (see here) để tiếp tục thêm hoạt ảnh và đặt tốc độ mới cho chu kỳ hoạt ảnh tiếp theo.

Original post:

Bạn đang thay đổi các giá trị mà bạn đã ban thông qua vào các hình ảnh động. Điều này sẽ không ảnh hưởng đến hoạt ảnh đang chạy. Bạn sẽ cần phải có một tham chiếu đến điều đó và thay đổi thuộc tính thời gian của đối tượng hoạt ảnh. Một cái gì đó như thế này trong phương pháp hành động của bạn:

CABasicAnimation *a = [displayLabel.layer animationForKey:@"rotationAnimation"]; 
a.duration = slider.value; 
+0

Không có gì xảy ra từ mã trên. –

+0

Tôi đã xem xét kỹ hơn một chút và bạn không thể thay đổi giá trị của hoạt ảnh đang chạy. Xem chỉnh sửa của tôi – jrturton

+0

dưới đây là cách bạn tạo hoạt ảnh ** có thể khởi động lại ** những ngày này trong iOS .. https://stackoverflow.com/a/45787919/294884 – Fattie

1

Tôi nghĩ jrturton đúng là bạn không thể thay đổi các thuộc tính trên một hoạt ảnh đang chạy. Nhưng những gì bạn có thể làm là phá vỡ hoạt ảnh thành các phân đoạn ngắn và thay đổi tốc độ cho phân khúc tiếp theo khi giá trị thanh trượt thay đổi.

Thay vì làm động từ điểm A đến điểm D, bạn sẽ tạo hiệu ứng động từ A-B, sau đó là B-C, rồi đến C-D. Sử dụng animationDidStop của lớp cha để kiểm tra điểm hiện tại, kiểm tra giá trị thanh trượt và khởi động hoạt ảnh tiếp theo.

Điều này có thể tạo ra chuyển động giật, nhưng nếu bạn sử dụng các phân đoạn rất nhỏ, bạn có thể làm mịn nó ra.

1

u nên ngăn chặn các hình ảnh động và khởi động lại một mới với thời gian thời hạn mới

nhưng hãy nhớ để đăng nhập xuống fromValue và toValue, và sử dụng toValue cũ như fromValue mới để thực hiện một sự thay đổi liền mạch

6

Tôi nghĩ cách tốt nhất để thay đổi tốc độ là thay đổi hệ thống thời gian của lớp của bạn

displayLabel.layer.timeOffset = 
    [displayLabel.layer convertTime:CACurrentMediaTime() fromLayer:nil]; 
displayLabel.layer.beginTime = CACurrentMediaTime(); 
displayLabel.layer.speed= slider.value; 

Bạn có thể xem trước. https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreAnimation_guide/AdvancedAnimationTricks/AdvancedAnimationTricks.html#//apple_ref/doc/uid/TP40004514-CH8-SW2

+0

tính năng này không hoạt động; đó là không liên quan. – Fattie

+0

@Fattie - có thể bạn đang tìm kiếm thứ gì đó khác biệt. Đây là câu trả lời chính xác và chính xác cho vấn đề. Nó làm việc cho tôi đẹp. –

+0

Tôi hiểu ý bạn là gì @LesNie - và có nó sẽ cung cấp giải pháp trong một số trường hợp. Tuy nhiên, nó thay đổi quy mô thời gian cho toàn bộ lớp. Cần thay đổi các thuộc tính của hoạt ảnh đang chạy là một vấn đề phổ biến (và khó chịu trong iOS). Tôi đã nhấp vào "+1" trên câu trả lời của bạn :) Chúc mừng năm mới! – Fattie

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