Tôi có khối hoạt ảnh để thực hiện hoạt ảnh dựa trên biến đổi đơn giản, khi hoàn thành sẽ xóa chế độ xem được đề cập từ trình giám sát của nó.Khối hoạt ảnh UIView tạm dừng cả hoạt ảnh và mã hoàn thành
UIView *msgView = [[UIView alloc] initWithFrame:CGRectMake(160, 120, 160, 100)];
// Do stuff to set up the subviews of msgView.
// Add the msgView to the superview (ViewController) that is going to display it.
CATransform3D transform = CATransform3DMakeScale(2.5, 2.5, 1.0);
[UIView animateWithDuration:5.0
animations:^(void){msgView.layer.transform = transform;}
completion:^(BOOL finished){[msgView removeFromSuperview];}];
sau đó tôi sử dụng các mã như trình bày chi tiết bởi Tech Q & Một 1673 http://developer.apple.com/library/ios/#qa/qa1673/_index.html để tạm dừng hoạt hình.
-(void)pauseLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
layer.speed = 0.0;
layer.timeOffset = pausedTime;
}
-(void)resumeLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer timeOffset];
layer.speed = 1.0;
layer.timeOffset = 0.0;
layer.beginTime = 0.0;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
layer.beginTime = timeSincePause;
}
Tuy nhiên, mã này không ngăn mã hoàn thành thực thi. Vì vậy, để ngăn chặn các mã từ thực hiện để thay đổi mã để hoàn thành như sau:
completion:^(BOOL finished){if(finished == TRUE)[msgView removeFromSuperview];};
Trong khi kiểm tra xong == TRUE ngăn chặn mã hoàn thành sự thực thi trong khi khối hình ảnh động bị tạm dừng. Nếu thời gian thời gian hiện được exceded trước khi bạn "bỏ tạm dừng" hoạt hình, mã hoàn thành sẽ không được thực thi. tức là Trong trường hợp này, msgView vẫn còn trong phần giám sát.
Có cách nào để tạm dừng/bỏ tạm dừng cả hoạt ảnh và hẹn giờ được kết hợp với mã hoàn thành (nếu đó là những gì đang diễn ra)?
Câu hỏi thú vị. Có thể được hiểu là một lỗi trong iOS. Để giải quyết vấn đề này, tôi khuyên bạn nên loại bỏ phần hoàn thành của hoạt ảnh của bạn, và thay vào đó hãy tạo NSTimer của riêng bạn với hoàn thành hiện tại của bạn là lời gọi của nó. Bằng cách này bạn có thể ngừng bộ đếm thời gian của bạn bên trong lớp tạm dừng (bằng cách thiết lập fireDate xa trong tương lai). Các resumeLayer bên trong bạn thiết lập lại fireDate là (timeSincePause + 5.0) – Rikkles
Tôi đã hy vọng để có được trực tiếp tại CAMediaTiming kết hợp với mã hoàn thành, trong cùng một cách chúng ta làm với lớp. Tôi nghĩ rằng nó sẽ là một giải pháp tốt hơn nhiều. – VariableSquid
Tôi đã viết một ứng dụng thử nghiệm trong iOS 6.1 và ứng dụng hoạt động chính xác, tức là bộ đếm thời gian của biến đổi tạm dừng. Bạn đang thử nghiệm hệ điều hành nào? – Rikkles