Tôi đang cố tạo một màn hình tùy chỉnh UIView
trên màn hình cho 5s khi có thông báo từ xa.Làm thế nào để thực hiện hoạt ảnh 'nối tiếp' với GCD?
Mã như thế này:
//customView.alpha = 1.0 here
[UIView animateWithDuration:1 animations:^{
customView.alpha = 0.3;
}
completion:^(BOOL finished){
// remove customView from super view.
}];
Vấn đề và Những gì tôi cần
Nhưng có trường hợp đang là một vài thông báo có thể đến ở khoảng thời gian ngắn, trong đó một số customView
thể hoạt hình cùng một lúc và một người có thể bao gồm người khác.
Tôi muốn các hoạt ảnh này thực hiện từng cái một, để chúng không xung đột.
Giả nhưng không thành công
//(dispatch_queue_t)queue was created in other parts of the code
dispatch_sync(queue, ^{
[UIView animationWithDuration:animations:...];
});
Sau khi thực hiện các hình ảnh động trong GCD hàng đợi, tôi nhận được kết quả tương tự như mã nguồn gốc tôi sử dụng, mà không sử dụng GCD. Ảnh động vẫn còn xung đột.
BTW, tôi nghe nói rằng hình ảnh động hoặc nhiệm vụ liên quan đến giao diện người dùng nên luôn luôn được chạy trên thread chính, nhưng trong mã thứ hai của tôi hoạt hình dường như làm smoothy. Tại sao?
Bạn có ý tưởng tương tự như @Ducan. Cảm ơn mã của bạn. Và bạn có nghĩ rằng chúng ta nên khóa 'self.numberOfTimesToRunAnimation'? – studyro
Có. Bằng cách không xác định thuộc tính là "nonatomic" và không bao giờ truy cập trực tiếp biến (luôn sử dụng thuộc tính), hệ thống sẽ khóa biến cho bạn sao cho hai luồng không đọc/ghi cùng một lúc. –
Rất đẹp. Tôi đã sử dụng điều này để kiểm soát giao diện người dùng SegedControl. Bằng cách đặt 'selectedIndex' vào thuộc tính và đặt nó thành' NSNotFound' khi hoàn thành, tôi không phải tắt điều khiển trong khi hoạt ảnh. Cảm ơn! –