Главная » iPhone » Панели навигации iPhone

0

iPhone не поддерживает панели инструментов в традиционном понимании

рабочего стола. Поскольку каждый экран приложения рассматривается как

страница в книге, то Apple создала собственную версию панели инструментов для iPhone, чтобы она имела более книжный вид. В отличие от панелей инструментов, которые могут отображать множество различных значков, панели навигации имеют определенные ограничения и могут содержать только заголовок страницы (например. "Сохраненные сообщения"), кнопки перехода к родительским страницам и текстовые кнопки для контекстно-зависимых функций, таких как включение громкой связи или очистки списка элементов. Панели навигации также могут поддерживать элементы управления для до- ‘ бавления кнопок с вкладками, например, кнопки вызова Все или Не принятые при просмотре последних вызовов.

Создание панели навигации

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

initwithFrame ТОЧНО так же, как И UlView: UINavigationBar *navBar = [ [UINavigationBar alloc] initwithFrame: CGRectMake(0, 0, 320, 48)

];

Приведенный фрагмент создает панели навигации высотой в 48 пикселов (по умолчанию) в точке (0,0)— левый верхний угол родительского вида. Это общепринятое соглашение, но панель навигации может быть создана в любом месте окна. Используя различные вертикальные отступы, вы можете поместить панель навигации внизу окна или под другой панелью навигации.

Чтобы узнавать о том, что на панели навигации что-либо произошло, например нажата та или иная кнопка, пользуйтесь делегатом панели навигации. Делегат (delegate) — это объект, который действует от имени другого объекта. Установив значение делегата панели навигации в self, вы можете заставить его отправлять события, например нажатия кнопок, объекту, создавшему панель навигации: r.avBar setDelegate: self ] ;

Чнимацией являются простые исчезающие переходы, происходящие при переходе от старого набора кнопок к новому набору, например, если кнопка после нажатия меняет свой вид. Эти плавные переходы вместо резких изме- (ений внешнего вида использует вызов enableAnimation: r.avBar enableAnimation ] ;

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

Установка заголовка

Заголовок панели навигации отображается в виде крупного текста белого цвета посередине панели. Заголовок часто используется для того, чтобы проинформировать конечного пользователя о том, какого рода информация отображена в окне, например, "Сохраненные сообщения".

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

UiNavigationitem *navltem = [ [ UiNavigationitem alloc ]

initWithTitle:@"My Example" ]; [ navBar pushNavigationltem: navltem ];

Здесь navltem указывает на только что созданный объект uiNavigationitem и имеет значение заголовка "My Example". Когда пользователь делает что- либо, что приводит к изменению заголовка, navltem может быть изменено на что-либо другое:

[ navltem setTitle: @"Another Example" ]

Кнопки и стили кнопок

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

Используя пример объекта navBar, созданный ранее, добавим на навигационную панель две кнопки — Good и Evil:

[ navBar showLeftButton:@"Good" withStyle: 0

rightButton:@"Evil" withStyle: 0 ];

Если вам нужна только одна кнопка, то вы можете заменить строку второй кнопки на значение nil. Например, если вы хотите предоставить пользователю на выбор только Evil:

[ navBar showLeftButton:nil withStyle: 0

rightButton:@"Evil" withStyle: 0 ];

Помимо задания названий кнопок, UIKit позволяет также применять различные стили. Например, обратите внимание, что когда вы нажимаете кнопку Speaker в приложении телефона iPhone, то кнопка становится синей. Некоторые кнопки могут иметь форму стрелки, передавая пользователю идею о возможности возврата назад. Путем изменения значения параметра withStyle в вызове метода, показанного ранее, вы можете выбирать из четырех различных стилей кнопок (табл. 3.1). Обратите особое внимание на номера стилей, которые начинаются с нуля.

Таблица 3.1

Стиль

Описание

0

Стиль, заданный по умолчанию, простая серая кнопка

1

Создает кнопку в форме левосторонней стрелки (стрелки назад)

2

Кнопки синего цвета, полезен для визуального выделения или таких переключателей, как Speaker

3

Кнопки красного цвета, полезен для переключателей предупреждений, например, Delete

J будущих выпусках программного обеспечения iPhone Apple может добавить дополнительные стили, но на сегодняшний день любые другие значения :риводят к стилю по умолчанию.

Нсли вы вообще не планируете использовать стили, то вот быстрый способ ^ здания кнопок панели навигации, избавляющий вас от части работы:

r.avBar showButtonsWithLeftTitle:@"Back" rightTitle: nil leftBack: YES ];

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

Стиль панели навигации

Сама панель навигации может быть отображена одним из нескольких различных стилей. Заданный по умолчанию стиль — это стандартное серое отображение. На сегодняшний день поддерживаются гри различных стиля (табл. 3.2).

Таблица 3.2

Стиль

Описание

0

Стиль, заданный по умолчанию, белый текст на сером фоне

1

Белый текст на сплошном черном фоне

2

Белый текст на прозрачном черном фоне

Стиль устанавливается с помощью вызова setbarstyle: [ navBar setBarStyle: 0 ];

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

Как только вы определитесь с начальным внешним видом вашей панели навигации, можно отобразить ее в вашем приложении. Панели навигации присоединены к объекту вида, например, основного вида, созданного вами в предыдущем примере:

[ self addSubview: navBar ];

Если вы захотите скрыть панель навигации, просто уберите ее с вида:

[ navBar removeFromSupeгview ];

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

[ navBar release ];

Перехват нажатий кнопок

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

Для этого необходимо подменить метод buttonClicked. Как будет показано в следующих главах, метод buttonClicked имеется у многих различных типов объектов, но все они принимают разные аргументы. Objective-C поддерживает полиморфизм, что позволяет разработчику поддерживать несколько методов, имеющих одно и то же название, но различные типы аргументов. Во время исполнения для вызова будет выбираться наиболее подходящая версия метода.

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

-  (void)navigationBar:(UINavigationBar *)navbar buttonClicked:(int)button;

Метод buttonClicked в классе вида уведомляется о том, принадлежит ли он панели навигации. Он вызывается с теми же самыми аргументами, с какими вызывался бы метод buttonClicked панели навигации, указателем на панель навигации и целым числом, определяющим номер нажатой кнопки. Значениями button, обозначающими левую и правую кнопки навигации, являются 1 и 0 соответственно:

-  (void)navigationBar:(OINavigationBar *)navbar buttonClicked:(int)button

swit i (button) { case 1:

/* Здесь обрабатывается левая кнопка */ break; case 0:

/* Здесь обрабатывается правая кнопка */ break;

Запрещение кнопок

Если вы вдруг захотите запретить какую-либо имеющуюся кнопку панели навигации, то у вас есть для этого два способа. Вы можете еще раз вызвать один из методов отображения кнопок (showButtonswithLeftTitie или showLeftButton), использовав значение nil, чтобы кнопка исчезла. Либо же, если вы хотите, чтобы кнопка оставалась видимой, но недоступной, т. е. пользователь не мог ее нажать, воспользуйтесь методом setButton: [ navBar setButton: 0 enabled: NO ];

Так же, как и в методе buttonClicked, используемый здесь номер кнопки соответствует либо левой (1), либо правой (0) кнопке.

Добавление сегментного элемента управления

Элементы управления (controls)— это небольшие независимые компоненты интерфейса, которые могут быть использованы классами UIK.it. Они могут прикрепляться к различным типам объектов, позволяя тем самым разработчику добавлять окну дополнительные способы взаимодействия с пользователем. Одним общим элементом управления, который присутствует на панелях навигации поставляемых Apple приложений, является сегментный элемент управления (segmented control).

Во многих поставляемых приложениях вы заметите, что Apple добавила кнопки для дальнейшего разделения отображения информации. Например, панель навигации в приложении iTunes WiFi Store вывела кнопки New Releases, What’s Hot и Genres наверх. Таким образом, осуществляется дальнейшее разделение музыкальных предпочтений пользователя. Сегментные элементы управления весьма полезны во всех аналогичных этой ситуациях, в которых чрезмерное количество данных лучше упорядочить с помощью отдельных вкладок.

Далее приведен пример настройки такого элемента управления с двумя сегментами:

UlSegmentedControl *segCtl = [ [ UlSegmentedControl alloc ] initwithFrame:CGRectMake(70.0, 8.0, 180.0, 30.0) withStyle: 2 withlterns* NULL J; [ segCtl insertSegment:0 withTitle:@"A11" animated: TRUE ];

[ segCtl insertSegment:1 withTitle:@"Missed" animated: TRUE ]; [ segCtl setDelegate:self ];

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

[ navBar addSubview: segCtl ];

Каждая кнопка в сегментном элементе управления называется сегментом. Доступ к выбранному сегменту можно получить с помощью вызова метода selectedSegment самого элемента управления:

int selectedSegment = [ segCtl selectedSegment ];

Большее количество элементов управления рассматривается в главе 7.

Пример: кнопка снижения громкости разговора с женой

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

Листинги 3.7 и 3.8 могут быть созданы с использованием пакета инструментов с помощью следующей командной строки:

arm-apple-darwin9-gcc -о MyExample MyExample.m -lobjc ^ -framework CoreFoundation -framework Foundation -framework UIKit

Листинг 3.7. Пример панели навигации (MyExample.h)

=import <CoreFoundation/CoreFoundation.h> – import <UIKit/UIKit.h> -.rport <UIKit/UINavigationBar.h> =.rport <UIKit/UINavigationItem.h>

@interface MainView : UlView

{

UINavigationBar *navBar; /* Наша панель навигации */ UINavigationltem *navltem; /* Заголовок панели навигации */ BOOL isMuted;                                   /* Включено ли снижение громкости? */

}

-    (id)initWithFrame:(CGRect)frame;

-    (void)-dealloc;

-    (UINavigationBar *)createNavBar:(CGRect)rect;

-    (void)setNavBar;

-    (void)navigationBar:(UINavigationBar *)navbar button- Clicked: (int)button;

@end

^interface MyApp : UIApplication {

UlWindow *window; MainView *mainView;

}

-    (void)applicationDidFinishLaunching:(NSNotification *)aNotification; @end

^Листинг 3.8. Пример панели навигации (MyExample.m)

#import "MyExample.h"

int main(int argc, char **argv) {

NSAutoreleasePool *autoreleasePool = [ [ NSAutoreleasePool alloc ] init

J;

int returnCode = UIApplicationMain(argc, argv, @"MyApp", @"MyApp"); [ autoreleasePool release ];

return returnCode;

}

@implementation MyApp

-    (void)applicationDidFinishLaunching:(NSNotification *)aNotification { window = [ [ UlWindow alloc ] initWithContentRect:

[ UlHardware fullScreenApplicationContentRect ]

1;

CGRect rect = [ UlHardware fullScreenApplicationContentRect ]; rect.origin.x = rect.origin.у = O.Of;

mainView = [ [ MainView alloc ] initwithFrame: rect ];

[ window setContentView: mainView ]; [ window orderFront: self ]; [ window makeKey: self ]; [ window _setHidden: NO ];

}

Send

implementation MainView

-    (id)initwithFrame:(CGRect)rect { self = [ super initwithFrame: rect ]; if (nil != self) {

isMuted = NO;

navBar = ‘[ self createNavBar: rect ];

/* Обновляем navBar в первый раз */ [ self setNavBar ];

[ self addSubview: navBar ]';

return self;

}

-     (void)dealloc <

[ navBar release ]; f navltem release ]; [ self dealloc ]; [ super dealloc ];

}

-    (UINavigationBar *)createNavBar:(CGRect)rect {

UINavigationBar *newNav = [ [UINavigationBar alloc] initwithFrame:

CGRectMake(rect.origin.x, rect.origin.у, rect.size.width, 48.0)

3;

[ newNav setDelegate: self ]; [ newNav enableAnimation ];

/* Добавляем наш заголовок */ navltem = [ [UINavigationltem alloc]

initWithTitle:@"My Example" ]; [ newNav pushNavigationltem: navltem ]; return newNav;

}

- (void)setNavBar {

if (isMuted == YES) {

[ navltem setTitle: @"Spouse (Muted)" ]; [ navBar showLeftButton:nil withStyle: 0

rightButton:@"Mute" withStyle: 3 ];

} else {

[ navltem setTitle: @"Spouse" ];

[ navBar showLeftButtonrnil withStyle: 0

rightButton:@"Mute" withStyle: 0 ];

}

)

- (void)navigationBar:(UINavigationBar *)navbar buttonClicked:(int)button {

if (button ==0) /* Правая кнопка */

{

if (isMuted == YES) /* Переключатель isMuted */

isMuted = NO; else

isMuted = YES;

[ self setNavBar ]; /* Обновляем кнопки navbar */

)

)

@ end

Как это работает

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

1.        Посредством функции main() порождается приложение и возвращается экземпляр приложения, как и в предыдущем примере.

2.        Создается окно с содержимым MainView. Оператор, создающий объект MainView, еще и вызывает его метод initwithFrame. Тем самым создается вид и панель навигации, а в качестве значения isMuted устанавливается no. Таким образом, приложение начинает свою работу в состоянии отключенного снижения громкости.

3.         Метод initwithFrame вызывает метод setNavBar для установки панели навигации в той конфигурации, которая соответствует состоянию isMuted. Первый вызов создает кнопки и заголовок для значения no.

4.      Когда пользователь коснется Mute, метод buttonci icked вызывается в виде (делегате панели). Тем самым переключается переменная isMuted, а затем снова вызывается setNavBar, что возвращает конфигурацию панели навигации в исходное состояние. В результате этого кнопка становится красной (стиль кнопки 1), а заголовок теперь содержит слово "Muted".

5.     Если пользователь опять коснется кнопки Mute, то метод buttonClicked вызывается снова, возвращая isMuted значение N0. Затем панель навигации еще раз обновляется с помощью вызова setNavBar.

Для дальнейшего изучения

Попробуйте протестировать фрагмент кода из этого раздела и из предыдущего.

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

?         Возьмите код uiTextview из листинга 3.2 и добавьте две кнопки: HTML и Text. Прикосновение к каждой из кнопок должно менять текстовый вид для отображения файла в соответствующем формате.

?         Проверьте наличие прототипов UINavigationBar.li и UINavigationltem.h в каталоге include пакета инструментов. Вы найдете ее в папке /toolchain/sys/usr/include/UIKit/. Поэкспериментируйте с различными доступными методами.

Источник: Здзиарски Дж. iPhone. Разработка приложений с открытым кодом: Пер„с англ. — 2-е изд., перераб. и доп. — СПб.: БХВ-Петербург, 2009. — 368 е.: ил.

По теме:

  • Комментарии