2015-10-12 3 views
0

Я хочу сделать три анимации просмотра, немного пошатнулся. Для этого я смешиваю 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, но взгляды все равно будут замешаны. (Со вторым переворотом, начиная с предыдущего). Я предполагаю, что это связано с тем, что я столкнулся с проблемой параллелизма.

Обязательно оцените руку помощи, особенно пример кода. --- Почти забыл: что было бы лучше, чем останавливать одновременные запросы, было бы поставить его в очередь, а затем запустить после завершения работы.

+0

'hiddenView' отличается в случаях A, B, & C, правильно? –

+0

да. A, B, C - братья и сестры. – user1272965

ответ

1

Документы для transitionFromView:... говорят: «Переход к виду начинается сразу же, если другая анимация уже находится в полете, и в этом случае она начинается сразу после окончания текущей анимации». Так что перекрывающаяся анимация не будет работать так.

Капля в CoreAnimation, например. CATransform3D, см. Core animation animating the layer to flip horizontally.

+0

Спасибо. Я могу сделать flip fine (и он выглядит выполнимым в кварце тоже), но проблема, с которой я столкнулась, блокирует более одного из них, запустив одновременно. У вас есть предложение об этом? – user1272965

+0

Теперь я запутался относительно желаемого результата вашего кода в отношении времени. –

+0

Сделал все возможное, чтобы прояснить в правде – user1272965

0

@ GrahamPerks попросил меня уточнить вопрос, и это разъясняет мое мышление. Если это может помочь кому-то другому, вот что я сделал.

Код инициализировал подпункты для анимации с тем же шагом в шахматном порядке, что и флип. Когда код был повторно введен, он изучал иерархию представления в частично измененном состоянии.

Исправления было решить, о взглядах переходного фронте, а не во время, то три шага анимация ...

- (void)flipAnimated:(BOOL)animated { 
    // views A,B,C are initialized here 

    // FIX: but also initialize six views here 
    UIView *viewAVisible, *viewAHidden, *viewBVisible, *viewBHidden, *viewCVisible, *viewCHidden; 

    // FIX: refactor my animation wrapper to take the two views to transition 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.01 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
     [self flipFrom:viewAHidden to:viewAVisible animated:animated]; 
    }); 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, interval * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
     [self flipFrom:viewBHidden to:viewBVisible animated:animated]; 
    }); 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2*interval * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
     [self flipFrom:viewCHidden to:viewCVisible animated:animated]; 
    }); 
} 

Теперь, когда новый запрос анимации приходит одновременно, взгляды скоординированным государства (потому что я думаю, что UIKit делает изменение, вызванное анимацией сразу).