2015-07-02 4 views
9

Я изо всех сил пытался найти ответ на этот вопрос. Я строй стек модальностей через:Визуальный артефакт при одновременном отклонении нескольких режимов просмотра модального изображения

[[[NavA viewControllers] objectAtIndex:0] presentViewController:NavB animated:YES completion:NULL]; 
[[[NavB viewControllers] objectAtIndex:0] presentViewController:NavC animated:YES completion:NULL]; 

Когда я хочу, чтобы закрыть Нава и NavB модальности одновременно я называю

[[[NavA viewControllers] objectAtIndex:0] dismissViewControllerAnimated:YES completion:NULL]; 

Это работает отлично, за исключением есть краткая вспышка, где вы можете см. NavB, поскольку полный стек отклоняется.

Я ступил через отладчик, и это выглядит как раньше анимация начинается NavC исчезает мгновенно и NavB увольняет с анимацией.

Есть ли способ избежать этого визуального артефакта и полностью отключить весь стек с NavC видно на весь период анимации?

Edit: Для уточнения, я представляю UINavigationController, а не потому, что UIViewController этот поток для входа пользователя в систему и имеет несколько возможных ветвей, которые могут привести обратно либо к текущей стадии, например, NavC (LoginPage), NavB (LandingPage с кнопками входа и регистрации) или полностью назад к корню, NavA (основная страница приложения). В документации IOS они представляют собой аналогичную картину дизайна с камерой, где каждая стадия представляет собой UINavigationController с несколькими возможными контроллерами отображения https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ModalViewControllers/ModalViewControllers.html

+0

Мне нужно понять это лучше. У вас есть 1 'UINavigationController', который имеет 3 контроллера вида,' A', 'B' и' C', в стеке или у вас есть 3 'UINavigationController' каждый, представленный '-presentViewController: анимированный: завершение:' –

+0

@JefferyThomas the second - NavB и NavC - это UINavigationControllers, представленные через '[self presentViewController: navController animated: TRUE завершение:^{}];' NavA - это контроллер корневого представления. – alexgophermix

+0

Вы используете НЕТ или ДА для анимации при увольнении? –

ответ

2

Вы можете подделать анимации выглядеть точно так, как вы хотите:

  • поп/отклонить B и C без анимации
  • нажимной/C присутствует без анимации
  • поп/отклонить C, используя любые анимации вы хотите
4

Фактически нет никакого способа сделать это, просто используя метод dismissViewControllerAnimated:completion: независимо от того, где вы его положили или как вы его называете (по крайней мере, я не мог, если кто-то знает способ - мы все хотим знать).


ОДНАКО есть взломать вы можете использовать для достижения желаемого результата (этот код должен быть вызван из «B» ViewController):

// Snapshot of "C" ViewController 
UIGraphicsBeginImageContextWithOptions([UIScreen mainScreen].bounds.size, YES, 0); 
UIView *snapshot = [self.presentedViewController.view snapshotViewAfterScreenUpdates:NO]; 
UIGraphicsEndImageContext(); 

// Cover the entire view of "B" (and hide navigation bar) 
[self.view addSubview:snapshot]; 
self.navigationController.navigationBarHidden = YES; 

// Dismiss "C" without animation 
[self.presentedViewController dismissViewControllerAnimated:NO completion:^{ 
    // Dismiss "B" with animation 
    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 
}]; 
+1

Будьте осторожны с этим решением. В iOS 7 функция rejectViewControllerAnimated: NO не выполняет макеты синхронно и может произойти сбой при вызове второго увольнения, поскольку контроллер просмотра по-прежнему рассматривается как «средний переход». –

+0

@JohnEstropia, так как первый из них без анимации, как вы думаете, это все равно повлияет? лучше ли просто добавить вторую строку внутри блока завершения первого? –

+0

Перемещение второго увольнения в завершение первого этапа обязательно предотвратит указанную проблему (хотя presentingViewController может мигать в течение секунды). Я не знаю, было ли это исправлено на iOS 8, но тогда у нас были проблемы с приковавшимися увольнениями. –

3

Если вы используете раскадровку то это должно быть осуществимо с помощью Unwind Segues. У Майка Уолмера есть good set of articles. В основном вы предоставляете информацию в Раскадке о том, как просмотр может разворачиваться через несколько разных представлений, чтобы получить представление, которое уже находится в стеке.

Однако я немного смущен тем же способом, что и Джеффри Томас в комментариях: почему вы представляете навигационный контроллер с другим контроллером навигации? Я могу понять, что вам может потребоваться, чтобы панель навигации выглядела по-разному на разных представлениях, но вы можете настроить ее, когда появится представление. Вы должны немного подумать о содержании просмотров в NavB и NavC и спросить себя, должны ли они быть представлены в виде модальных представлений или же они будут лучше использоваться как часть единого стека навигации. Представляя каждый контроллер навигации, вы получаете множество навигационных стеков, а не один стек с несколькими контроллерами представлений. Даже если только NavB и NavC были частью одного и того же стека, вероятно, он удалит визуальный глюк, который вы видите.

Если вы использовали один контроллер навигации, вы можете вернуться к предыдущему контроллеру представления в стеке навигации, используя метод -popToViewController:animated: на UINavigationController.

Если вы решите, что представление NavB и NavC, как вы сейчас делаете, это правильная вещь, вы можете попасть в неприятности, потому что, когда вы попросите NavA отклонить его контроллер просмотра, он попытается отклонить NavB, который это означает настройку перехода между видом NavB и NavA. Вот почему вы видите этот переход, а не тот, который вы хотите (что находится между видом NavC и NavA). Один из способов, который может работать (и звучит немного странно) - попытаться представить NavA из NavC, затем переопределить переход, чтобы он выглядел так, будто вы выталкиваете NavC из стека. Как только вы там, вы можете очистить вещи, удалив любые сильные ссылки на NavB и NavC. This article from Ash Furrow доставит вам большую часть пути.

+0

К сожалению, я не использую раскадровки. Я представляю контроллеры навигации, а не контроллеры представлений из-за нескольких ветвей, которые должны возвращаться на каждый этап. В качестве эксперимента я представил только UIViewControllers вместо этого и получил ту же самую глючную анимацию. В этом тесте поток был следующим: [NavA viewControllers [0] present: VCB] -> [VCB present VCC] -> [NavA viewControllers [0] увольнять] – alexgophermix

+1

Спасибо за ваш ответ, кстати, он заставил меня пересмотреть и я обнаружил, что некоторые презентации не выполнялись в основном потоке в другом месте приложения. Кроме того, из документов Apple, представляющих навигационные контроллеры, а не View Controllers, также является шаблон документа, и они предоставляют пример https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ModalViewControllers/ModalViewControllers.html – alexgophermix

+0

Извините, что я должен был было немного яснее об этом. Проблема не возникает из-за того, что вы используете UINavigationControllers вместо UIViewControllers (как вы уже протестировали).Я говорил, что если бы вы были для нас как UINavigationController, а именно для управления стеком из нескольких контроллеров представлений, тогда задача одновременного появления двух контроллеров представлений стала бы тривиальной, поскольку они являются частью одного и того же навигационный стек. Вложенные модальные представления ведут себя совершенно по-другому. – quantumkid

Смежные вопросы