Tôi đã gặp sự cố trong đó tôi có một loạt chuỗi CATransition / CAAnimation chồng chéo, tất cả những thứ này tôi cần thực hiện các thao tác tùy chỉnh khi hoạt ảnh dừng lại, nhưng tôi chỉ muốn một trình xử lý ủy quyền cho animationDidStop.
Tuy nhiên, tôi gặp sự cố, dường như không có cách nào để xác định duy nhất mỗi CATransition / CAAnimation trong đại biểu animationDidStop.
Tôi đã giải quyết vấn đề này thông qua hệ thống khóa / giá trị được hiển thị như một phần của CAAnimation.
Khi bạn bắt đầu hoạt ảnh của mình, hãy sử dụng phương thức setValue trên CATransition / CAAnimation để đặt số nhận dạng và giá trị của bạn để sử dụng khi animationDidStop kích hoạt:
-(void)volumeControlFadeToOrange
{
CATransition* volumeControlAnimation = [CATransition animation];
[volumeControlAnimation setType:kCATransitionFade];
[volumeControlAnimation setSubtype:kCATransitionFromTop];
[volumeControlAnimation setDelegate:self];
[volumeControlLevel setBackgroundImage:[UIImage imageNamed:@"SpecialVolume1.png"] forState:UIControlStateNormal];
volumeControlLevel.enabled = true;
[volumeControlAnimation setDuration:0.7];
[volumeControlAnimation setValue:@"Special1" forKey:@"MyAnimationType"];
[[volumeControlLevel layer] addAnimation:volumeControlAnimation forKey:nil];
}
- (void)throbUp
{
doThrobUp = true;
CATransition *animation = [CATransition animation];
[animation setType:kCATransitionFade];
[animation setSubtype:kCATransitionFromTop];
[animation setDelegate:self];
[hearingAidHalo setBackgroundImage:[UIImage imageNamed:@"m13_grayglow.png"] forState:UIControlStateNormal];
[animation setDuration:2.0];
[animation setValue:@"Throb" forKey:@"MyAnimationType"];
[[hearingAidHalo layer] addAnimation:animation forKey:nil];
}
Trong đại biểu animationDidStop của bạn:
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag{
NSString* value = [theAnimation valueForKey:@"MyAnimationType"];
if ([value isEqualToString:@"Throb"])
{
//... Your code here ...
return;
}
if ([value isEqualToString:@"Special1"])
{
//... Your code here ...
return;
}
//Add any future keyed animation operations when the animations are stopped.
}
Khía cạnh khác của điều này là nó cho phép bạn giữ trạng thái trong hệ thống ghép nối giá trị khóa thay vì phải lưu trữ nó trong lớp đại biểu của bạn. Càng ít mã, càng tốt.
Hãy nhớ xem Tài liệu tham khảo của Apple về Mã hóa cặp giá trị chính .
Có kỹ thuật nào tốt hơn để nhận dạng CAAnimation / CATransition trong đại biểu animationDidStop không?
Cảm ơn, --Batgar
CAAnimation
nó delegate
rất mạnh, vì vậy bạn có thể cần đặt nó thành nil
để tránh các chu kỳ lưu giữ!