NavigationController имеет стеки ViewController для управления и ограниченные переходы анимации.
Добавление контроллера представления в качестве вспомогательного представления к существующему контроллеру представления требует передачи событий в контроллер вспомогательного просмотра, что является трудной задачей для управления, загружается с небольшим раздражением и в целом выглядит как неудачный взлом при реализации (Apple также рекомендует против делая это).
Представление модального контроллера представления снова помещает контроллер представления поверх другого, и, хотя у него нет проблем передачи событий, описанных выше, он на самом деле не «меняет» контроллер представления, он укладывает его в стек.
Раскадровки ограничены iOS 5 и почти идеальны, но их нельзя использовать во всех проектах.
Может ли кто-нибудь представить ПРИМЕР СОЛИДНОГО КОДА о способе изменения контроллеров представления без вышеуказанных ограничений и допускает анимированные переходы между ними?
Близкий пример, но без анимации: как использовать несколько пользовательских контроллеров представления iOS без контроллера навигации
Редактировать: использование Nav Controller хорошо, но должны быть анимированные стили перехода (а не просто эффекты слайдов), отображаемый контроллер представления должен быть полностью заменен (не сложен). Если второй контроллер представления должен удалить другой контроллер представления из стека, то он недостаточно инкапсулирован.
Редактировать 2: iOS 4 должна быть базовой ОС для этого вопроса, я должен был уточнить это при упоминании раскадровки (выше).
источник
Ответы:
РЕДАКТИРОВАТЬ: Новый ответ, который работает в любой ориентации. Оригинальный ответ работает только тогда, когда интерфейс находится в портретной ориентации. Это анимация перехода вида b / c, которая заменяет вид с другим видом, который должен иметь место, если вид, по меньшей мере, на уровень ниже первого вида, добавленного в окно (например
window.rootViewController.view.anotherView
).Я реализовал простой контейнерный класс, который я назвал
TransitionController
. Вы можете найти его на https://gist.github.com/1394947 .Кроме того, я предпочитаю реализацию в отдельном классе, потому что ее проще использовать повторно. Если вы этого не хотите, вы можете просто реализовать ту же логику непосредственно в делегате приложения, устраняя необходимость в
TransitionController
классе. Однако логика, которая вам нужна, будет такой же.Используйте это следующим образом:
В вашем приложении делегат
Для перехода на новый контроллер представления из любого контроллера представления
РЕДАКТИРОВАТЬ: оригинальный ответ ниже - работает только для ориентации портрета
Я сделал следующие предположения для этого примера:
У вас есть контроллер вида, назначенный в качестве
rootViewController
вашего окнаКогда вы переключаетесь на новое представление, вы хотите заменить текущий viewController на viewController, которому принадлежит новое представление. В любое время активен только текущий viewController (например, alloc'ed).
Код может быть легко изменен для работы по-другому, ключевой момент - анимированный переход и контроллер единого представления. Убедитесь, что вы не сохраняете контроллер представления нигде, кроме того, чтобы назначить его
window.rootViewController
.Код для анимации перехода в приложении делегат
Пример использования в контроллере вида
источник
TransitionController.m
наUIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
, но я использовал это только на самой новой версии iOS, поэтому протестируйте внимательно.Вы можете использовать новую систему сдерживания viewController от Apple. Для получения более подробной информации ознакомьтесь с видео сеанса WWDC 2011 «Внедрение
UIViewController
сдерживания».Новое в iOS5,
UIViewController
Containment позволяет вам иметь родительский viewController и несколько дочерних viewController, которые содержатся в нем. Вот как работает UISplitViewController. Делая это, вы можете сложить контроллеры представления в родительском, но для вашего конкретного приложения вы просто используете родительский для управления переходом от одного видимого viewController к другому. Это одобренный Apple способ ведения дел, и анимация от одного дочернего viewController безболезненна. Кроме того, вы можете использовать все различныеUIViewAnimationOption
переходы!Кроме того, с UIViewContainment, вам не нужно беспокоиться, если вы не хотите, о беспорядке управления дочерними viewControllers во время событий ориентации. Вы можете просто использовать следующее, чтобы убедиться, что ваш parentViewController перенаправляет события вращения в дочерние viewControllers.
Вы можете сделать следующее или подобное в методе viewDidLoad вашего родителя, чтобы настроить первый childViewController:
затем, когда вам нужно изменить дочерний viewController, вы вызываете что-то вроде следующего в родительском viewController:
Я разместил полный пример проекта здесь: https://github.com/toolmanGitHub/stackedViewControllers . Этот другой проект показывает, как использовать
UIViewController
Containment на некоторых входных типах viewController, которые не занимают весь экран. Удачиисточник
[self.currentViewController willMoveToParentViewController:nil];
до перехода?Хорошо, я знаю, что вопрос говорит без использования навигационного контроллера, но нет причин не делать этого. ОП не отвечала на комментарии вовремя, чтобы я пошла спать. Не голосуй за меня. :)
Вот как вывести текущий контроллер представления и перейти к новому контроллеру представления с помощью контроллера навигации:
источник
Поскольку я только что натолкнулся на эту точную проблему и попробовал варианты всех ранее существовавших ответов на ограниченный успех, я опубликую, как в конце концов решил ее:
Как описано в этом посте на пользовательских сегментах , на самом деле очень легко создавать собственные сегменты. Их также очень легко подключить в Интерфейсном Разработчике, они поддерживают отношения в IB видимыми и не требуют особой поддержки со стороны контроллеров представления исходного / конечного объекта.
В сообщении, приведенном выше, приведен код iOS 4, позволяющий заменить текущий контроллер вида сверху в стеке navigationController новым, использующим анимацию скольжения сверху.
В моем случае я хотел, чтобы произошла похожая замена, но с
FlipFromLeft
переходом. Мне также нужна была только поддержка iOS 5+. Код:Из RAFlipReplaceSegue.h:
Из RAFlipReplaceSegue.m:
Теперь, удерживая нажатой клавишу Control, настройте любой другой вид перехода, затем сделайте его пользовательским и введите имя пользовательского класса segue, et voilà!
источник
–performSegueWithIdentifier:sender:
метода UIViewController .Я долго боролся с этим, и один из моих вопросов указан здесь , я не уверен, что у вас была эта проблема. Но вот что я бы порекомендовал, если он должен работать с iOS 4.
Во-первых, создайте новый
NavigationController
класс. Вот где мы выполним всю грязную работу - другие классы смогут «чисто» вызывать методы экземпляра типа «pushViewController:
такой-то». В вашем.h
:Массив дочерних контроллеров представления будет служить хранилищем для всех контроллеров представления в нашем стеке. Мы автоматически перенаправим весь код поворота и изменения размера из
NavigationController
представления вcurrentController
.Теперь в нашей реализации:
Теперь вы можете реализовать свой собственный
pushViewController:
,popViewController
и тому подобное, используя эти вызовы методов.Удачи, и я надеюсь, что это поможет!
источник
viewWillAppear
,viewDidAppear
и тому подобное.Попробуйте этот код.
Этот код дает Переход от контроллера представления к другому контроллеру представления, который имеет контроллер навигации.
источник