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
});
Другие вопросы по тегам