2016-06-20 4 views
0

У меня есть этот бит кода, который я использую для переключения контроллера корневого представления с приятной анимацией, он работал в течение нескольких месяцев ... но затем случайно переставал работать.UIView AnimateWithDuration никогда не достигает блока завершения

UIView snapshot = [self.window snapshotViewAfterScreenUpdates:YES]; 
[viewController.view addSubview:snapshot]; 
self.window.rootViewController = viewController; 
NSLog(@"check point 1"); 
[UIView animateWithDuration:0.3 animations:^{ 
    NSLog(@"check point 2"); 
    snapshot.layer.opacity = 0; 
    NSLog(@"check point 3"); 
    snapshot.layer.transform = CATransform3DMakeScale(1.5, 1.5, 1.5); 
    NSLog(@"check point 4"); 
} completion:^(BOOL finished) { 
    NSLog(@"check point 5"); 
    [snapshot removeFromSuperview]; 
    NSLog(@"check point 6"); 
}]; 

Я поставил эти контрольно-пропускные пункты, все через контрольные точки 4 триггеров .., но 5 и 6 никогда не срабатывали. Настолько странно для меня, потому что даже если это не удалось, блок завершения все равно должен срабатывать.

В новом загрузочном контроллере корневого представления запрашивается разрешение пользователя на сбор его или ее местоположения. Так что, может быть, когда появится этот всплывающий экран, это разрушит этот переход? Однако это не смущало.

ответ

1

Блок завершения не будет вызывать, если нет ничего для анимации или части перехода, уже выполненной какой-либо другой частью исходного кода, а фрагмент кода работает в другом потоке (кроме потока пользовательского интерфейса). Поэтому только для иллюстрации, завершение блока ниже кода никогда не будет вызывать,

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     NSLog(@"check point 1"); 
     [UIView animateWithDuration:10.3 animations:^{ 
      NSLog(@"check point 4"); 
     } completion:^(BOOL finished) { 
      NSLog(@"check point 5"); 
      [snapshot removeFromSuperview]; 
      NSLog(@"check point 6"); 
     }]; 
}); 

Чтобы решить эту проблему, заключите код внутри этого кода,

dispatch_async(dispatch_get_main_queue(), ^{ 
    //Your code, This runs on main thread 
}); 
+0

работал отлично! спасибо – Gukki5

+0

@ Gukki5, рад, что это помогло :) –