Визуальный артефакт при одновременном отклонении нескольких контроллеров модального представления

Я изо всех сил пытался найти ответ на этот вопрос. Я создаю стек модалов через:

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

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

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

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

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

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

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

3 Solutions collect form web for “Визуальный артефакт при одновременном отклонении нескольких контроллеров модального представления”

На самом деле нет никакого способа сделать это, просто используя 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]; }]; 

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

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

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

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

Вы можете подделать анимацию так, как хотите:

  • pop / off B и C без анимации
  • push / present C без анимации
  • pop / off C используя любую анимацию, которую вы хотите
  • iOS - заблокировать определенный UIViewController для определенной ориентации
  • SWRevealViewController nib cell не выполняет segue
  • Условно пропускание UIViewController в приложении iOS 5 с помощью UINavigatonController
  • Что происходит после того, как viewController помещается в другой viewController
  • iOS - Полупрозрачный контроллер модального просмотра
  • Что означает текст внутри круглых скобок в директивах @interface и @implementation?
  • Как изменить размер представления при использовании UINavigationController setToolbarHidden: анимированный:
  • ViewController addSubview
  • UICollectionview, реализующий поиск
  • Как я могу уведомить систему о том, когда поддерживаетсяInterfaceOrientations?
  • Увольнение ViewController показано как Popover segue изнутри другого Popover
  • Interesting Posts

    В чем разница между синим и черным цветом в режиме отладки?

    Добавьте UIToolBar ко всем клавиатурам (быстро)

    Поймать сбои и исключения в iOS

    Пользовательское сопоставление шаблонов в Swift 2.2 не работает должным образом

    iOS MapKit: как предотвратить изменение MKMapView setRegion из региона?

    Переключиться в режим Objective-C в lldb

    Код ошибки Crashlytics: 202 при отправке файлов

    Как читать метки номеров телефонной книги?

    Можно ли распространять приложение iOS в разных категориях для определенных стран?

    API для Google Диска iOS. Операция не может быть завершена. (ошибка com.google.GTMOAuth2 -1000.)

    Не удается проверить приложение Кордовы, когда оно открыто в браузере.

    registerForRemoteNotificationTypes не работает?

    удалите предупреждение, которое появляется при вызове из приложения iOS с помощью telprompt: //

    Размытое изображение (NSTextAttachment) в NSAttributedString

    Экран сжимается в iOS 7 при создании проекта в Xcode 6.1 и более поздних версиях

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.