2014-05-22 12 views
5

Tôi đang cố gắng tạo hoạt ảnh tương tác sử dụng số speed trong số 0,0 và điều khiển thuộc tính timeOffset để phản hồi hành động của người dùng. Tôi muốn trạng thái ban đầu của hoạt ảnh ở đâu đó ở giữa hoạt ảnh được xác định khi hành động của người dùng cho phép hoạt ảnh tiến hành cả về phía trước và lùi từ điểm bắt đầu.Làm cách nào để tôi có thể bắt đầu hoạt ảnh tương tác tại thời điểm bù trừ tùy ý?

Dưới đây là một số mã mẫu là trường hợp đơn giản của những gì tôi đang cố gắng thực hiện.

@interface TestViewController : UIViewController {} 
@property (strong, nonatomic) IBOutlet UIView * transformerView; 
@property (strong, nonatomic) IBOutlet UISlider * slider; 
@end 

@implementation TCTestViewController {} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.slider.minimumValue = 0.0f; 
    self.slider.maximumValue = 1.0f; 
    self.slider.value = 0.5f; 

    CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
    animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeTranslation(-320.0f, 0.0f, 0.0f)]; 
    animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeTranslation(320.0f, 0.0f, 0.0f)]; 
    animation.duration = 1.0f; 

    self.transformerView.layer.speed = 0.0; 
    [self.transformerView.layer addAnimation:animation forKey:@"test"]; 

    // *** THIS IS THE PROBLEM LINE *** 
    self.transformerView.layer.timeOffset = 0.5; 
} 

- (IBAction)onSliderValueChanged { 
    self.transformerView.layer.timeOffset = self.slider.value; 
} 

@end 

điều khiển Quan điểm này có một cái nhìn tôi thêm một hình ảnh động mà sẽ dịch trong X-trục từ -320pt đến + 320pt, và tôi muốn bắt đầu nó ở giữa như vậy không có bản dịch đến khi người dùng tương tác với nó. Tôi cũng có một thanh trượt, khi được thay đổi, đặt thuộc tính timeOffset để khớp với vị trí thanh trượt.

Nếu tôi bỏ qua dòng sự cố trong đó timeOffset được đặt thành 0,5, tất cả đều hoạt động như mong đợi, nhưng chế độ xem bắt đầu được dịch bởi -320pt. Sau đó nó theo dõi đúng thanh trượt từ điểm đó.

Khi dòng sự cố xảy ra, tất cả đều sai lầm khủng khiếp. Chế độ xem vẫn bắt đầu được dịch bởi -320pt và chỉ theo dõi thanh trượt khi giá trị thanh trượt cao hơn 0,5. Thậm chí sau đó, bản dịch chỉ đi từ -320pt đến 0pt và không bao giờ dịch cao hơn. Đối với các giá trị thanh trượt dưới 0,5, không có bản dịch nào cả.

Không có gì khác biệt nếu tôi đặt dòng sự cố trước hoặc sau khi thêm hoạt ảnh vào lớp. Trợ giúp là gì nếu tôi sử dụng -performSelector:withObject:afterDelay với độ trễ là 0.0 để đặt số timeOffset ban đầu vào lần lặp lại tương lai của vòng lặp chạy, nhưng trước khi người dùng tương tác với thanh trượt. Thật không may, cách giải quyết này không thực tế đối với dự án thực vì tôi cần tạo hoạt ảnh khi người dùng bắt đầu tương tác.

Tại sao thuộc tính timeOffset không hoạt động khi được đặt trong cùng vòng lặp chạy do hoạt ảnh đã được thêm vào lớp? Tôi nghĩ rằng những gì đang xảy ra là khi timeOffset được đặt tại thời điểm này, nó sẽ trở thành thời gian cơ sở mới cho hoạt ảnh.

Bất cứ ai cũng có thể gợi ý cách tôi có thể tạo hoạt ảnh có thể tương tác với thuộc tính timeOffset và đặt để bắt đầu ở một nơi nào đó không phải là bắt đầu?

+0

@ Matt - Tốt suy nghĩ, nhưng trong dự án ban đầu mẫu này được chuyển thể từ, vấn đề xảy ra trong một phương pháp được gọi là tốt sau khi viewDidLoad. – GBegen

Trả lời

1

tôi sẽ thử như sau:

dispatch_async(dispatch_get_main_queue(), ^{ 
    self.transformerView.layer.timeOffset = 0.5; 
}); 
Các vấn đề liên quan