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

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

[[[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 используя любую анимацию, которую вы хотите
  • Правильный способ создания пользовательского всплывающего окна / предупреждения UIView / UIViewController
  • iOS - presentViewController с прозрачностью
  • Почему UIViewController является подклассом UIResponder?
  • Выполнить код перед инициализацией контроллера First View (приложение на основе раскадровки)
  • Как достоверно обнаружить, что UIViewController был уволен
  • Увольнение ViewController показано как Popover segue изнутри другого Popover
  • Невозможно получить доступ к свойству UIColor UIView из UIViewController
  • Элементы IBOutlet появляются, когда я пытаюсь установить их в viewDidLoad
  • Есть ли способ «создать» пользовательский UIView в раскадровке и использовать в нескольких ViewControllers без добавления какого-либо конкретного контроллера?
  • Программный интерфейс: не вызывайте super.loadView, но вызывайте super.viewDidLoad?
  • Как правильно представить контроллер представления?
  • Interesting Posts

    iOS: заголовок заголовка iMessage и пользовательский интерфейс делителя

    Z Индекс изображения и разделителя в UITableViewCell

    MKAnnotationView всегда показывает infoButton вместо detailDisclosure btn

    Почему вращение этой призмы в iOS Metal не выполняется правильно?

    Манипулирование CATransform3D слоя UIView и CGAffineTransform UIView одновременно

    Преобразование iPhone NIB в iPad NIB в Xcode 5

    Как передать данные в диспетчер представлений и загрузить их, прежде чем нажимать их на стек навигации?

    UISlider выделяет состояние с большой шириной большого пальца, чем обычно

    Отправить в App Store

    Как правильно применить к подклассу в Swift?

    React Native FBSDK непризнанный селектор, отправленный в экземпляр

    Датчик контакта Box2d COCOS2D

    Горизонтальный просмотр таблицы (в TableViewCell), не реагирующий на прокрутку

    Запуск Today Widgets из Xcode

    У меня есть изображения и имена друзей FB в пользовательском представлении таблицы. Как получить выбранную строку в идентификаторах FB и отправить запрос нескольким друзьям?

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