Контроллеры навигации

Контроллер навигации управляет штабелем контроллеров представления для обеспечения интерфейса развертки для иерархического содержания. Иерархия представления контроллера навигации сам содержавшая. Это составлено из представлений, что контроллер навигации управляет непосредственно и представления, которыми управляют довольным контроллеры представления, которые Вы обеспечиваете. Каждый довольный контроллер представления управляет отличной иерархией представления, и контроллер навигации координирует навигацию между этими иерархиями представления.

Несмотря на то, что интерфейс навигации состоит главным образом из Вашего пользовательского содержания, существуют все еще места, где Ваш код должен взаимодействовать непосредственно с объектом контроллера навигации. В дополнение к сообщению контроллера навигации, когда вывести на экран новое представление, Вы ответственны за конфигурирование панели навигации — представление наверху экрана, обеспечивающего контекст о месте пользователя в иерархии навигации. Можно также обеспечить элементы для панели инструментов, которой управляет контроллер навигации.

В этой главе описываются, как Вы конфигурируете и используете контроллеры навигации в своем приложении. Для получения информации о путях, которыми можно объединить контроллеры навигации с другими типами объектов контроллера представления, посмотрите Объединенные Интерфейсы контроллера Представления.

Анатомия интерфейса навигации

Основное задание контроллера навигации должно управлять представлением Вашего довольного контроллеры представления, и это также ответственно за представление некоторых пользовательских собственных представлений. В частности это представляет панель навигации, содержащую кнопку «Назад» и некоторые кнопки, которые можно настроить. Контроллер навигации может также дополнительно представить представление панели навигации и заполнить его с пользовательскими кнопками.

Рисунок 1-1 показывает интерфейс навигации. Представление навигации в этом числе является представлением, сохраненным в контроллере навигации view свойство. Все другие представления в интерфейсе являются частью непрозрачной иерархии представления, которой управляет контроллер навигации.

Рисунок 1-1  представления интерфейса навигации

Несмотря на то, что панель навигации и панель инструментов являются настраиваемыми представлениями, Вы никогда не должны изменять представления в иерархии навигации непосредственно. Единственный способ настроить эти представления через методы UINavigationController и UIViewController классы. Для получения информации о том, как настроить содержание панели навигации, посмотрите Настройку Появления Панели навигации. Для получения информации о том, как вывести на экран и сконфигурировать пользовательские элементы панели инструментов в интерфейсе навигации, видит Отображение Панели навигации.

Объекты интерфейса навигации

Контроллер навигации использует несколько объектов реализовать интерфейс навигации. Вы ответственны за обеспечение некоторых из этих объектов, и остальные создаются самим контроллером навигации. В частности Вы ответственны за обеспечение контроллеров представления с содержанием, которое Вы хотите представить. Если Вы хотите реагировать на уведомления от контроллера навигации, можно также обеспечить объект делегата. Контроллер навигации создает представления — такие как панель навигации и панель инструментов — которые используются для интерфейса навигации, и это ответственно за управление теми представлениями. Рисунок 1-2 показывает отношение между контроллером навигации и этими ключевыми объектами.

  Объекты рисунка 1-2, которыми управляет контроллер навигации

Для панели навигации и объектов панели инструментов, связанных с контроллером навигации, можно только настроить некоторые аспекты их появления и поведения. Один только контроллер навигации ответственен за конфигурирование и отображение их. Кроме того, объект контроллера навигации автоматически присваивает себя как делегат UINavigationBar возразите и препятствует другим объектам изменить то отношение.

Можно изменить делегата и другие контроллеры представления на штабеле навигации. Штабель навигации является набором метода «последним пришел - первым вышел» пользовательских объектов контроллера представления, которым управляет контроллер навигации. Первый элемент, добавленный к штабелю, становится корневым контроллером представления и никогда не выталкивается от штабеля. Дополнительные элементы могут быть добавлены к штабелю с помощью методов UINavigationController класс.

Рисунок 1-3 показывает соответствующие отношения между контроллером навигации и объектами на штабеле навигации. (Обратите внимание на то, что контроллер вида сверху и видимый контроллер представления, не обязательно то же. Например, если Вы представляете контроллер представления модально, значение visibleViewController свойство изменяется для отражения модального контроллера представления, представленного, но topViewController свойство не изменяется.)

Рисунок 1-3  штабель навигации

Основная ответственность контроллера навигации состоит в том, чтобы реагировать на пользовательские действия путем продвижения новый довольный контроллеры представления на штабель или сования контроллеров представления содержания прочь штабеля. Каждый контроллер представления Вы спешите штабель навигации, ответственен за представление некоторой части данных Вашего приложения. Как правило, когда пользователь выбирает элемент в в настоящее время видимом представлении, Вы устанавливаете контроллер представления, имеющий подробные данные для того элемента, и продвиньте его на штабель навигации. Например, когда пользователь выбирает фотоальбом в фото приложении, приложение продвигает контроллер представления, выводящий на экран фотографии в том альбоме.

Этот процесс следует простому шаблону разработки — каждый довольный, что контроллер представления в штабеле конфигурирует и продвигает довольное контроллер представления, который является поверх него в штабеле. Необходимо избежать заставлять контроллер представления зависеть от того, чтобы быть продвинутым на штабель экземпляром определенного класса. Вместо этого для пасования назад данных вниз штабель при совании контроллеров представления установите контроллер представления, который ниже в штабеле как делегат того, который является выше его в штабеле.

В большинстве случаев Вы не должны выталкивать контроллеры представления от штабеля программно. Вместо этого контроллер навигации обеспечивает кнопку «Назад» на панели навигации, выталкивающей самый верхний контроллер представления автоматически, когда пользователь касается его.

Для получения дополнительной информации о том, как настроить панель навигации, посмотрите Настройку Появления Панели навигации. Для получения информации о продвижении контроллеров представления на штабель навигации (и удаление их позже), посмотрите Изменение Штабеля Навигации. Для получения информации о том, как настроить содержание панели инструментов, посмотрите Отображение Панели навигации.

Создание интерфейса навигации

При создании интерфейса навигации необходимо решить, как Вы намереваетесь использовать интерфейс навигации. Поскольку это налагает всеобъемлющую организацию по Вашим данным, необходимо только использовать его в этих особенных методах:

В первых трех сценариях контроллер навигации обеспечивает ключевую роль Вашего основного интерфейса и остается на месте до выходов приложения. Последние два сценария отражают более временное использование для контроллеров навигации, когда процесс для использования контроллера навигации идентичен процессу для другого довольного контроллеры представления. Единственная разница - то, что контроллер навигации продолжает обеспечивать дополнительные функции навигации, не доступные с синглом, довольным контроллер представления. Несмотря на то, что следующие разделы фокусируются о том, как Вы создаете более постоянные типы интерфейса навигации, большинство шагов настройки и общей информации применяются ко всем контроллерам навигации, независимо от того, как Вы намереваетесь использовать их.

Определение довольного контроллеры представления для интерфейса навигации

Каждый интерфейс навигации имеет один уровень данных, представляющих корневой уровень. Этот уровень является начальной точкой Вашего интерфейса. Например, фото отображения приложения список доступных фотоальбомов на корневом уровне его иерархии данных. Выбор фотоальбома тогда выводит на экран фотографии в том альбоме, и выбор фотографии показывает увеличенную версию фотографии.

  Контроллеры представления Defining рисунка 1-4 для каждого уровня данных

Для реализации интерфейса навигации необходимо решить что данные представить на каждом уровне иерархии данных. Для каждого уровня необходимо обеспечить довольное контроллер представления, чтобы управлять и представить данные на том уровне. Если представление на многократных уровнях является тем же, можно создать многократные экземпляры того же класса контроллера представления и сконфигурировать каждого для управления его собственным набором данных. Например, фото приложение имеет три отличных типа презентации, как показано на рисунке 1-4, таким образом, это должно было бы использовать три отличных класса контроллера представления.

Каждый довольный контроллер представления должен обеспечить способ для пользователя перейти к следующему уровню иерархии данных, за исключением контроллеров представления, управляющих листовыми данными. Контроллер представления, выводящий на экран список элементов, может использовать касания в данной ячейке таблицы для отображения следующего уровня данных. Например, когда пользователь выбирает фотоальбом из списка верхнего уровня, фото приложение создает новый контроллер представления фотоальбома. Новый контроллер представления инициализируется с достаточной информацией об альбоме для него для представления соответствующих фотографий.

Для получения общей информации и руководство при определении пользовательских контроллеров представления, посмотрите Создающий Пользовательский Довольный Контроллеры Представления в поле зрения Руководство по программированию Контроллера для iOS.

Создание интерфейса навигации Используя раскадровку

При создании нового проекта XCode Шаблон приложений Основной Подробности дает Вам контроллер навигации в раскадровке, набор как первая сцена.

Для создания контроллера навигации в раскадровке сделайте следующее:

  1. Перетащите контроллер навигации из библиотеки.

  2. Интерфейсный Разработчик создает контроллер навигации и контроллер представления, и это создает отношение между ними. Это отношение идентифицирует недавно создаваемый контроллер представления как корневой контроллер представления контроллера навигации.

  3. Выведите на экран его как первый контроллер представления путем выбора опции Is Initial View Controller в инспекторе Атрибутов (или представьте контроллер представления в пользовательском интерфейсе в другом отношении.)

Создание интерфейса навигации программно

Если Вы предпочитаете создавать контроллер навигации программно, можно сделать так от любой надлежащей точки в коде. Например, если контроллер навигации обеспечивает корневое представление для Вашего окна приложения, Вы могли бы создать контроллер навигации в applicationDidFinishLaunching: метод Вашего делегата приложения.

При создании контроллера навигации необходимо сделать следующее:

  1. Создайте корневой контроллер представления для интерфейса навигации.

    Этот объект является контроллером представления верхнего уровня в штабеле навигации. Панель навигации не выводит на экран кнопки «Назад», когда ее представление выведено на экран, и контроллер представления не может быть вытолкан от штабеля навигации.

  2. Создайте контроллер навигации, инициализировав его с помощью initWithRootViewController: метод.

  3. Установите контроллер навигации как корневой контроллер представления Вашего окна (или иначе представьте его в Вашем интерфейсе).

Перечисление 1-1 показывает простую реализацию applicationDidFinishLaunching: метод, создающий контроллер навигации и устанавливающий его как корневой контроллер представления главного окна приложения. navigationController и window переменные являются задействованными переменными делегата приложения и MyRootViewController класс является пользовательским классом контроллера представления. Когда окно для этого примера выведено на экран, интерфейс навигации представляет представление для корневого контроллера представления в интерфейсе навигации.

Перечисление 1-1  , Создающее контроллер навигации программно

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
    UIViewController *myViewController = [[MyViewController alloc] init];
    navigationController = [[UINavigationController alloc]
                                initWithRootViewController:myViewController];
 
    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    window.rootViewController = navigationController;
    [window makeKeyAndVisible];
}

Принятие полноэкранного расположения для представлений навигации

Как правило, интерфейс навигации выводит на экран Ваше пользовательское содержание в разрыве между нижней частью панели навигации и вершиной панели инструментов или панели вкладок (см. рисунок 1-1). Однако контроллер представления может попросить, чтобы его представление было выведено на экран с полноэкранным расположением вместо этого. В полноэкранном расположении довольные просматривают, сконфигурирован к underlap панель навигации, строка состояния и панель инструментов как надлежащий. Это расположение позволяет Вам максимизировать видимую сумму содержания для пользователя и полезно для фото дисплеев или других мест, где Вы могли бы хотеть больше пространства.

При определении, должно ли представление быть измерено для заполнения всех или большей части экрана, контроллер навигации рассматривает несколько факторов, включая следующее:

Каждый из этих факторов используется для определения заключительного размера пользовательского представления. Порядок элементов в предыдущем списке также отражает приоритет, по которому рассматривают каждый фактор. Размер окна является первым ограничивающим фактором; если главное окно Вашего приложения (или содержание родительского представления в случае модально представленного контроллера представления) не охватывает экран, представления, которые это содержит, не могут сделать так также. Точно так же, если панель навигации или панель инструментов видимы, но не полупрозрачны, не имеет значения, если контроллер представления хочет, чтобы его представление было выведено на экран с помощью полноэкранного расположения. Контроллер навигации никогда не выводит на экран содержание под непрозрачной панелью навигации.

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

  1. Сконфигурируйте кадр своего пользовательского представления для заполнения экранных границ.

    Обязательно сконфигурируйте атрибуты автоизменения размеров Вашего представления также. Атрибуты автоизменения размеров гарантируют, что, если Ваше представление должно быть изменено, оно корректирует свое содержание соответственно. Также, когда Ваше представление изменено, можно вызвать setNeedsLayout метод Вашего представления, чтобы указать, что должна быть скорректирована позиция его подпредставлений.

  2. К underlap панель навигации, набор полупрозрачный свойство из Вашего контроллера навигации к YES.

  3. К underlap дополнительная панель инструментов, набор translucent свойство панели инструментов на YES.

  4. К underlap строка состояния, набор wantsFullScreenLayout свойство Вашего контроллера представления к YES.

При представлении интерфейса навигации окна или представления, к которому Вы добавляете, Ваше представление навигации должно также быть измерено соответственно. Если Ваше приложение использует контроллер навигации в качестве своего основного интерфейса, то Ваше главное окно должно быть измерено для соответствия экранных размерностей. Другими словами, необходимо установить его размер для соответствия bounds свойство UIScreen класс (вместо applicationFrame свойство). Фактически, для интерфейса навигации, обычно лучше создать Ваше окно с полноэкранными границами во всех ситуациях, потому что контроллер навигации корректирует размер своих представлений для размещения строки состояния автоматически так или иначе.

При представлении контроллера навигации модально содержание, представленное тем контроллером навигации, ограничивается контроллером представления, делающим представление. Если тот контроллер представления не хочет к underlap строку состояния, то модально представленный контроллер навигации не будет позволенным underlap строка состояния также. Другими словами, родительское представление всегда имеет некоторое влияние по тому, как его модально представленные представления выведены на экран.

Для получения дополнительной информации о том, как сконфигурировать интерфейс для поддержки полноэкранного расположения, посмотрите Создающий Пользовательский Довольный Контроллеры Представления в поле зрения Руководство по программированию Контроллера для iOS.

Изменение штабеля навигации

Вы ответственны за создание объектов, находящихся на штабеле навигации. При инициализации объекта контроллера навигации необходимо обеспечить довольное контроллер представления для отображения корневого содержания иерархии данных. Можно добавить или демонтировать контроллеры представления программно или в ответ на взаимодействие с пользователем. Класс контроллера навигации предоставляет несколько возможностей для управления содержанием штабеля навигации. Эти опции покрывают различные сценарии, с которыми Вы, вероятно, встретитесь в своем приложении. Таблица 1-1 перечисляет эти сценарии и как Вы реагируете на них.

Табличные 1-1  Опции для управления штабелем навигации

Сценарий

Описание

Выведите на экран следующий уровень иерархических данных.

Когда пользователь выбирает элемент, выведенный на экран самым верхним контроллером представления, можно использовать переход или pushViewController:animated: метод для продвижения нового контроллера представления на штабель навигации. Новый контроллер представления ответственен за представление содержания выбранного пункта.

Скопируйте один уровень в иерархии.

Контроллер навигации обычно обеспечивает кнопку «Назад», чтобы удалить самый верхний контроллер представления из штабеля и возвратиться к предыдущему экрану. Можно также демонтировать самый верхний контроллер представления программно с помощью popViewControllerAnimated: метод.

Восстановите штабель навигации к предыдущему состоянию.

Когда Ваше приложение запускается, можно использовать setViewControllers:animated: метод для восстановления контроллера навигации к предыдущему состоянию. Например, Вы использовали бы этот метод для возврата пользователя тому же экрану, который они просматривали, когда они в последний раз выходят из приложения.

Для восстановления приложения к предыдущему состоянию необходимо сначала сохранить достаточно информации состояния для воссоздания необходимых контроллеров представления. Когда пользователь выходит из Вашего приложения, необходимо было бы сохранить некоторые маркеры или другую информацию, указывающую позицию пользователя в иерархии данных. В следующий раз запуска Вы тогда считали бы эти информации состояния и использовали бы его для воссоздания необходимых контроллеров представления прежде, чем вызвать setViewControllers:animated: метод. Для получения дополнительной информации о сохранении и восстановлении состояния, посмотрите состояния Приложения и Многозадачность в Руководстве по программированию Приложения для iOS.

Можно также использовать этот метод для перехода к произвольному расположению в иерархии данных. Переход к произвольному расположению может легко вызвать беспорядок, однако, таким образом, необходимо проявить специальную заботу для передачи то, что происходит ясно с пользователем.

Возвратите пользователя корневому контроллеру представления.

Для возврата к вершине интерфейса навигации используйте popToRootViewControllerAnimated: метод. Этот метод удаляет все кроме корневого контроллера представления от штабеля навигации.

Скопируйте произвольное число уровней в иерархии.

Для поддержки больше чем одного уровня за один раз используйте popToViewController:animated: метод. Вы могли бы использовать этот метод в ситуациях, где Вы используете контроллер навигации для управления редактированием пользовательского содержания (вместо того, чтобы представить содержание модально). Если пользователь решает отменить работу после продвижения многократных экранов редактирования можно использовать этот метод для удаления всех экранов редактирования сразу, а не по одному.

При анимации продвижения или сования контроллеров представления контроллер навигации автоматически создает анимации, имеющие большую часть смысла. Например, если Вы выталкиваете многократные контроллеры представления от штабеля с помощью popToViewController:animated: метод, контроллер навигации использует анимацию только для самого верхнего контроллера представления. Все другие промежуточные контроллеры представления отклонены без анимации. Если Вы продвигаете или выталкиваете элемент с помощью анимации, необходимо ожидать, пока анимация не завершена, прежде чем Вы попытаетесь продвинуть или вытолкать другой контроллер представления.

Наблюдение изменений к штабелю навигации

Каждый раз, когда Вы продвигаете или выталкиваете контроллер представления, контроллер навигации отправляет сообщения в затронутые контроллеры представления. Когда его штабель изменяется, контроллер навигации также отправляет сообщения своему делегату. Рисунок 1-5 показывает последовательность событий, происходящую во время нажатия или популярной работы и соответствующих сообщений, отправляющихся в Ваши пользовательские объекты на каждом этапе. Новый контроллер представления отражает контроллер представления, собирающийся стать самым верхним контроллером представления на штабеле.

  Сообщения рисунка 1-5 отправили во время изменений штабеля

Можно использовать методы делегата контроллера навигации, чтобы скоординировать между довольным контроллеры представления, например обновить состояние, совместно использующееся ими. Если Вы продвигаете или выталкиваете многократные контроллеры представления сразу, только контроллеру представления, который был видим и контроллер представления, собирающийся стать видимым, вызвали метод. Промежуточным контроллерам представления не вызывали метод, если объединение в цепочку не происходит в обратном вызове (например, если Ваша реализация viewWillAppear: вызовы pushViewController:animated:).

Можно использовать isMovingToParentViewController и isMovingFromParentViewController методы UIViewController определить, появляется ли контроллер представления или исчезает в результате нажатия или населения

Настройка появления панели навигации

Панель навигации является представлением, управляющим средствами управления в интерфейсе навигации, и она берет на себя специальную роль, когда управляется объектом контроллера навигации. Гарантировать непротиворечивость и сокращать объем работы должны были создать интерфейсы навигации, каждый объект контроллера навигации создает свою собственную панель навигации и берет большую часть ответственности за управление что содержание панели. По мере необходимости контроллер навигации взаимодействует с другими объектами (как Ваш довольный контроллеры представления) для помощи в этом процессе.

Конфигурирование объекта элемента навигации

Структура панели навигации подобна структуре контроллера навигации во многих отношениях. Как контроллер навигации, панель навигации является контейнером для содержания, которое предоставлено другими объектами. В случае панели навигации содержание предоставлено один или больше UINavigationItem объекты, хранящиеся с помощью структуры данных штабеля, известной как штабель элемента навигации. Каждый элемент навигации обеспечивает полный набор представлений и содержания, которое будет выведено на экран в панели навигации.

Рисунок 1-6 показывает некоторые ключевые объекты, связанные с панелью навигации во время выполнения. Владелец панели навигации (является ли это контроллером навигации или Вашим пользовательским кодом) ответственен за продвижение элементов на штабель и сование их прочь по мере необходимости. Для обеспечения надлежащей навигации панель навигации поддерживает указатели для выбора объектов в штабеле. Несмотря на то, что большая часть содержания панели навигации получена из самого верхнего элемента навигации, указатель на задний элемент сохраняется так, чтобы могла быть создана кнопка «Назад» (с заголовком предыдущего элемента).

Рисунок 1-6  объекты связался с панелью навигации

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

Панель навигации помещает элементы в три основных позиции: левый, правильный, и центральный. Таблица 1-2 перечисляет свойства UINavigationItem класс, которые используются для конфигурирования каждой из этих позиций. При конфигурировании элемента навигации для использования с контроллером навигации, знать, что пользовательские элементы управления в некоторых позициях могут быть проигнорированы в пользу ожидаемых средств управления. Описание каждой позиции включает информацию о том, как используются Ваши пользовательские объекты.

Табличные 1-2  позиции Элемента на панели навигации

Позиция

Свойство

Описание

Левый

backBarButtonItem

leftBarButtonItem

В интерфейсе навигации контроллер навигации присваивает Кнопку «Назад» левой позиции по умолчанию. Для обеспечивания Кнопки «Назад» по умолчанию контроллером навигации получите значение backBarButtonItem свойство.

Чтобы присвоить пользовательскую кнопку или представление к левой позиции, и таким образом заменить Кнопку «Назад» по умолчанию, присваивают a UIBarButtonItem возразите против leftBarButtonItem свойство.

Центр

titleView

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

Если Вы не обеспечиваете пользовательское представление заголовка, панель навигации выводит на экран пользовательское представление со строкой заголовка элемента навигации. Или, если элемент навигации не обеспечивает заголовок, панель навигации использует заголовок контроллера представления.

Право

rightBarButtonItem

Эта позиция пуста по умолчанию. Это обычно используется для размещения кнопок для редактирования или изменения текущего экрана. Можно также поместить пользовательские представления сюда путем обертывания представления в a UIBarButtonItem объект.

Рисунок 1-7 показывает, как содержание панели навигации собрано для интерфейса навигации. Элемент навигации, связанный с контроллером текущего представления, обеспечивает содержание для центральных и правильных позиций панели навигации. Элемент навигации для предыдущего контроллера представления обеспечивает содержание для левой позиции. Несмотря на то, что левые и правые элементы требуют, чтобы Вы указали a UIBarButtonItem объект, можно обернуть представление в элемент кнопки панели как показано в числе. Если Вы не обеспечиваете пользовательское представление заголовка, элемент навигации создает один для Вас использующий заголовок контроллера текущего представления.

  Структура Панели навигации рисунка 1-7

Показ и сокрытие панели навигации

Когда панель навигации используется в сочетании с контроллером навигации, Вы всегда используете setNavigationBarHidden:animated: метод UINavigationController показать и скрыть панель навигации. Вы никогда не должны скрывать панель навигации путем изменения UINavigationBar объект скрытый свойство непосредственно. В дополнение к показу или сокрытию панели, с помощью метода контроллера навигации дает Вам более сложные способы поведения бесплатно. В частности, если контроллер представления показывает или скрывает панель навигации в viewWillAppear: метод, контроллер навигации анимирует появление или исчезновение панели для совпадения с появлением нового контроллера представления.

Поскольку пользователю нужна кнопка «Назад» на панели навигации для навигации назад на предыдущий экран, Вы никогда не должны скрывать панель навигации, не давая пользователю некоторый способ возвратиться к предыдущему экрану. Наиболее распространенный способ предоставить навигационную поддержку состоит в том, чтобы прервать сенсорные события и использовать их для переключения видимости панели навигации. Например, когда единственное изображение является выведенным на экран полным экраном, фото приложение делает это. Вы могли также обнаружить, сильно ударяют жесты и используют их для сования контроллера текущего представления от штабеля, но это поведение является менее поддающимся обнаружению, чем простое переключение видимости панели навигации.

Изменение объекта панели навигации непосредственно

В интерфейсе навигации контроллеру навигации принадлежит UINavigationBar возразите и ответственно за управление им. Не допустимо измениться, панель навигации возражают или изменяют ее границы, кадр или альфа-значения непосредственно. Однако существует несколько свойств, которые можно изменить, включая следующее:

Рисунок 1-8 показывает как barStyle и translucent свойства влияют на появление панели навигации. Для полупрозрачных стилей стоит отметить, что, если основное представление базового контроллера представления является представлением прокрутки, панель навигации автоматически корректирует значение вставки содержания, чтобы позволить содержанию прокручивать из-под панели навигации. Это не вносит эту корректировку для других типов представлений.

  Стили Панели навигации рисунка 1-8

Если Вы хотите показать или скрыть всю панель навигации, необходимо так же использовать setNavigationBarHidden:animated: метод контроллера навигации, а не изменяет панель навигации непосредственно. Для получения дополнительной информации о показе и сокрытии панели навигации, посмотрите Показ и Сокрытие Панели навигации.

Используя пользовательские кнопки и представления как элементы навигации

Для настройки появления панели навигации для определенного контроллера представления измените атрибуты его связанного UINavigationItem объект. Можно получить элемент навигации для контроллера представления от navigationItem свойство. Контроллер представления не создает свой элемент навигации, пока Вы не запрашиваете его, таким образом, необходимо попросить этот объект, только если Вы планируете установить контроллер представления в интерфейсе навигации.

Если Вы принимаете решение не изменить элемент навигации для своего контроллера представления, элемент навигации обеспечивает ряд объектов по умолчанию, которые должны быть достаточными во многих ситуациях. Любые настройки, которые Вы делаете, имеют приоритет по объектам по умолчанию.

Для самого верхнего контроллера представления элемент, выведенный на экран на левой стороне панели навигации, определяется с помощью соблюдающих правил:

  • Если Вы присваиваете пользовательский элемент кнопки панели leftBarButtonItem свойство самого верхнего элемента навигации контроллера представления, тому элементу дают самое высокое предпочтение.

  • Если Вы не обеспечиваете пользовательский элемент кнопки панели и элемент навигации контроллера представления, каждый уравнивает на штабеле навигации, имеет допустимый элемент в backBarButtonItem свойство, панель навигации выводит на экран тот элемент.

  • Если элемент кнопки панели не указан ни одним из контроллеров представления, кнопка «Назад» по умолчанию используется, и ее заголовок установлен в значение свойства заголовка предыдущего контроллера представления — т.е. контроллер представления, который каждый уравнивает на штабеле навигации. (Если самый верхний контроллер представления является корневым контроллером представления, никакая кнопка «Назад» по умолчанию не выведена на экран.)

Для самого верхнего контроллера представления элемент, выведенный на экран в центре панели навигации, определяется с помощью соблюдающих правил:

  • Если Вы присваиваете пользовательское представление titleView свойство самого верхнего элемента навигации контроллера представления, дисплеи панели навигации то представление.

  • Если никакое пользовательское представление заголовка не установлено, панель навигации выводит на экран пользовательское представление, содержащее заголовок контроллера представления. Строка для этого представления получена из title свойство элемента навигации контроллера представления. Если значение того свойства nil, строка от title свойство самого контроллера представления используется.

Для самого верхнего контроллера представления элемент, выведенный на экран на правой стороне панели навигации, определяется с помощью соблюдающих правил:

  • Если новый контроллер представления верхнего уровня имеет пользовательский правильный элемент кнопки панели, тот элемент выведен на экран. Для указания пользовательского правильного элемента кнопки панели установите rightBarButtonItem свойство элемента навигации.

  • Если никакой пользовательский правильный элемент кнопки панели не указан, панель навигации ничего не выводит на экран на правой стороне панели.

Для добавления пользовательского текста запроса выше средств управления панелью навигации присвойте значение prompt свойство элемента навигации.

Рисунок 1-9 показывает различные конфигурации панели навигации, включая несколько, которые используют пользовательские представления и подсказки. Панелями навигации в этом числе является от демонстрационной Настройки проекта UINavigationBar.

  Пользовательские кнопки рисунка 1-9 в панели навигации

Перечисление 1-2 показывает код из приложения NavBar, которое потребовалось бы, чтобы создавать третью панель навигации на рисунке 1-9, который является панелью навигации, содержащей правильный элемент кнопки панели с пользовательским представлением. Поскольку это находится в правильной позиции на панели навигации, необходимо обернуть пользовательское представление с a UIBarButtonItem объект прежде, чем присвоить его rightBarButtonItem свойство.

Перечисление 1-2  , Создающее пользовательские элементы кнопки панели

// View 3 - Custom right bar button with a view
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:
                                      [NSArray arrayWithObjects:
                                          [UIImage imageNamed:@"up.png"],
                                          [UIImage imageNamed:@"down.png"],
                                          nil]];
 
[segmentedControl addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged];
segmentedControl.frame = CGRectMake(0, 0, 90, kCustomButtonHeight);
segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
segmentedControl.momentary = YES;
 
defaultTintColor = segmentedControl.tintColor;    // Keep track if this if you need it later.
UIBarButtonItem *segmentBarItem = [[UIBarButtonItem alloc] initWithCustomView:segmentedControl];
self.navigationItem.rightBarButtonItem = segmentBarItem;

Конфигурирование Вашего элемента навигации контроллера представления программно является наиболее распространенным подходом для большинства приложений. Несмотря на то, что Вы могли создать Разработчика Интерфейса использования элементов кнопки панели, часто намного более просто создать их программно. Необходимо создать элементы в viewDidLoad метод Вашего контроллера представления.

Используя редактирование и сделанные кнопки

Представления, поддерживающие оперативное редактирование, могут включать специальный тип кнопки в их панели навигации, позволяющей пользователю переключаться назад и вперед между режимами отображения и режимами редактирования. editButtonItem метод UIViewController когда нажатые переключатели между кнопкой Edit и Done и вызывают контроллер представления, возвращает предварительно сконфигурированную кнопку это setEditing:animated: метод с надлежащими значениями. Для добавления этой кнопки к панели навигации контроллера представления Вы использовали бы код, подобный следующему:

myViewController.navigationItem.rightBarButtonItem = [myViewController editButtonItem];

При включении этой кнопки в панель навигации необходимо также переопределить контроллер представления setEditing:animated: метод и использование это для корректировки иерархии представления. Для получения дополнительной информации о реализации этого метода посмотрите Создающий Пользовательский Довольный Контроллеры Представления в поле зрения Руководство по программированию Контроллера для iOS.

Отображение панели навигации

В iOS 3.0 и позже, интерфейс навигации может вывести на экран панель инструментов и заполнить его с элементами, предоставленными в настоящее время видимым контроллером представления. Самой панелью инструментов управляет объект контроллера навигации. Поддержка панели инструментов на этом уровне необходима для создания плавных переходов между экранами. Когда самый верхний контроллер представления на изменениях штабеля навигации, контроллер навигации анимирует изменения между различными наборами элементов панели инструментов. Это также создает плавные анимации в случаях, где Вы хотите переключить видимость панели инструментов для определенного контроллера представления.

Для конфигурирования панели инструментов для интерфейса навигации необходимо сделать следующее:

Рисунок 1-10 показывает пример того, как объекты, которые Вы связываете с Вашим довольным контроллер представления, отражаются на панели инструментов. Элементы выведены на экран на панели инструментов на том же порядке, им предоставлены в массиве. Массив может включать все типы элементов кнопки панели, включая фиксированные и гибкие элементы пространства, системные элементы кнопки или любые элементы пользовательской кнопки, которые Вы обеспечиваете. В этом примере эти пять элементов являются всеми элементами кнопки из Почтового приложения.

  Элементы Панели инструментов рисунка 1-10 в интерфейсе навигации

Указание элементов панели инструментов

При конфигурировании элементов кнопки панели не забудьте связывать надлежащую цель и действие с кнопкой. Информация о цели и действии - то, что Вы используете для ответа на касания на панели инструментов. В большинстве случаев цель должна быть самим контроллером представления, так как это ответственно за обеспечение элементов панели инструментов. Рисунок 1-11 показывает демонстрационную панель инструментов с сегментированным управлением в центре.

Указать элементы панели инструментов с помощью раскадровки:

  1. Перетащите панель инструментов с библиотеки.

  2. Добавьте два гибких элемента кнопки клавиши «Пробел» к панели инструментов путем перетаскивания их от библиотеки.

  3. Добавьте сегментированное управление от библиотеки, между гибкими кнопками клавиши «Пробел», путем перетаскивания его от библиотеки.

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

Рисунок 1-11  сегментированное управление центрировался на панели инструментов

Перечисление 1-3 показывает, что код должен был указать элементы панели инструментов программно. Вы реализовали бы метод в своем контроллере представления и вызвали бы его во время инициализации.

Перечисление 1-3  , Конфигурирующее панель инструментов с сегментированным управлением в центре

- (void)configureToolbarItems
{
   UIBarButtonItem *flexibleSpaceButtonItem = [[UIBarButtonItem alloc]
                        initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                        target:nil action:nil];
 
   // Create and configure the segmented control
   UISegmentedControl *sortToggle = [[UISegmentedControl alloc]
                        initWithItems:[NSArray arrayWithObjects:@"Ascending",
                                        @"Descending", nil]];
   sortToggle.segmentedControlStyle = UISegmentedControlStyleBar;
   sortToggle.selectedSegmentIndex = 0;
   [sortToggle addTarget:self action:@selector(toggleSorting:)
               forControlEvents:UIControlEventValueChanged];
 
   // Create the bar button item for the segmented control
   UIBarButtonItem *sortToggleButtonItem = [[UIBarButtonItem alloc]
                                    initWithCustomView:sortToggle];
 
   // Set our toolbar items
   self.toolbarItems = [NSArray arrayWithObjects:
                         flexibleSpaceButtonItem,
                         sortToggleButtonItem,
                         flexibleSpaceButtonItem,
                         nil];
}

В дополнение к установке элементов панели инструментов во время инициализации контроллер представления может также изменить свой существующий набор элементов панели инструментов динамично с помощью setToolbarItems:animated: метод. Этот метод полезен для ситуаций, где Вы хотите обновить команды панели инструментов для отражения некоторого другого пользовательского действия. Например, Вы могли использовать его для реализации ряда иерархических элементов панели инструментов, посредством чего ответвление кнопки на панели инструментов выводит на экран ряд связанных дочерних кнопок.

Показ и сокрытие панели инструментов

Для сокрытия панели инструментов для определенного контроллера представления установите hidesBottomBarWhenPushed свойство того контроллера представления к YES. Когда контроллер навигации встречается с контроллером представления с этим набором свойств к YES, это генерирует надлежащую анимацию перехода каждый раз, когда контроллер представления продвинут на (или удален из), штабель навигации.

Если Вы хотите скрыть панель инструментов иногда (но не всегда), можно вызвать setToolbarHidden:animated: метод контроллера навигации в любое время. Распространенный способ использовать этот метод состоит в том, чтобы объединить его с вызовом к setNavigationBarHidden:animated: метод для создания временного полноэкранного представления. Например, фото приложение переключает видимость обеих панелей, когда это выводит на экран единственную фотографию, и пользователь касается экрана.