Я хочу сделать три анимации просмотра, немного пошатнулся. Для этого я смешиваю GCD и анимацию вида следующим образом:Смешивание GCD с анимацией просмотра
EDIT - Я хотел бы сделать флип-анимацию с дочерними элементами viewA, затем viewB, затем viewC. Я хотел бы эти анимации перекрываться ...
random external action causes: A-----------A'
B-----------B'
C---------C'
Беда, когда запускающее действие происходит во время анимации в A-> C», состояние трех перепутать. Я хотел бы сделать три шагающих действия как единое, непрерывное действие.
- (void)flipAnimated:(BOOL)animated {
// views A,B,C are initialized here
// kFLIPDURATION is 0.8
NSTimeInterval interval = (animated)? kFLIPDURATION/2.0 : 0;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.01 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self flipChildrenOfView:viewA animated:animated];
});
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, interval * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self flipChildrenOfView:viewB animated:animated];
});
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2*interval * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self flipChildrenOfView:viewC animated:animated];
});
}
- (void)flipChildrenOfView:(UIView *)parent animated:(BOOL)animated {
// some setup here to get visible and hidden views
[UIView transitionFromView:visibleView
toView:hiddenView
duration:((animated)? kFLIPDURATION : 0)
options:UIViewAnimationOptionTransitionFlipFromLeft | UIViewAnimationOptionShowHideTransitionViews
completion:nil];
}
Это работает отлично, за исключением того, есть таймер событий, а иногда действия пользователя управляя этим, и каждый так часто, flipAnimated:
вызывается во время анимации продолжаются. В результате замешаны взгляды и печаль.
Я пробовал до сих пор читать (1), и они путаются с альтернативами GCD. (2) Я попробовал переменную экземпляра с именем animating
, добавил блок завершения на мой взгляд анимации метод вызывающему, то сделал это ...
@property(assign,nonatomic) BOOL animating;
- (void)flipAnimated:(BOOL)animated {
if (self.animating) return;
self.animating = YES;
NSTimeInterval interval = (animated)? kFLIPDURATION/2.0 : 0;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.01 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self flipChildrenOfView:viewA animated:animated completion:nil];
});
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, interval * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self flipChildrenOfView:viewB animated:animated completion:nil];
});
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2*interval * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self flipChildrenOfView:viewC animated:animated completion:^(BOOL finished) {
self.animating = NO;
}];
});
}
Но, увы, такое же поведение. Я мог наблюдать блок, который, похоже, работает с NSLogs, но взгляды все равно будут замешаны. (Со вторым переворотом, начиная с предыдущего). Я предполагаю, что это связано с тем, что я столкнулся с проблемой параллелизма.
Обязательно оцените руку помощи, особенно пример кода. --- Почти забыл: что было бы лучше, чем останавливать одновременные запросы, было бы поставить его в очередь, а затем запустить после завершения работы.
'hiddenView' отличается в случаях A, B, & C, правильно? –
да. A, B, C - братья и сестры. – user1272965