Главная » iPhone » Введение в UIKit iPhone

0

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

UIKit— это больше, чем просто набор инструментов пользовательского интерфейса; это также основание для исполнения GUI-приложений iPhone. Когда приложение запущено, его функция main о обрабатывает объект JiApplication в рамках UIKit. Этот класс— базовый для всех приложений, имеющих в iPhone пользовательский интерфейс, и он предоставляет доступ уровня приложений к функциям более высокого уровня iPhone. Помимо этого, общие сервисы уровня приложения, например, приостановка, возобновление и завершение, являются функциями объекта uiApplication.

Чтобы начать использование UIKit, ваше приложение должно подключиться к оболочке UIKit. Как оболочка, UIKit является неким вариантом библиотеки совместного использования. Поэтому, используя пакет инструментов компилятора, UIKit может быть подключен к вашему приложению путем добавления к аргументам компилятора, описанным в главе 2, следующих аргументов:

arm-apple-darwin9-gcc -о МуАрр MyApp.m -lobjc ‘Ъ

-framework CoreFoundation

-framework Foundation -framework UIKit

Чтобы добавить эту возможность в пример таке-файла из предыдущей главы, добавьте оболочку UIKit в раздел флагов компоновщика:

LDFLAGS = -lobjc Ь

-framework CoreFoundation ^ -framework Foundation -framework UIKit

Основные элементы пользовательского интерфейса

Целью этой главы является подготовка вас к работе с основными составляющими пользовательского интерфейса. UIKit поддерживает приведенные далее элементы пользовательского интерфейса. Более сложные функциональные возможности UIKit описаны в главе 7.

?         Окна и виды являются базовыми классами для создания пользовательского интерфейса любого типа. Окно (window) представляет собой геометрическое пространство на экране, а вид (view) выступает в роли контейнера для других объектов. Все небольшие компоненты пользовательского интерфейса,tнапример, панели навигации, кнопки и текстовые поля, привязаны к виду, а уже этот вид прикреплен к какому-либо окну. Окно можно рассматривать как рамку картины, а вид — как само полотно. Окно может иметь только один вид, но виды могут содержать более мелкие подвиды, включая другие виды.

Управляющий вид (controlling view)— это вид, который управляет тем, как другие виды отображаются на экране. Управляющий вид выполняет переходы к другим видам и реагирует на события, происходящие на экране.

?         Текстовые виды (text views)— это специальные классы видов, представляющие окно редактора, для просмотра или редактирования текста или HTML. Очень хорошим примером простейшего текстового вида является приложение Блокнот (Notepad). Вообще говоря, текстовые виды прикидываются скромными и в своем репертуаре редко используют более эффектные инструменты пользовательского интерфейса.

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

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

?        Листы действий (action sheets) являются аналогом всплывающих окон напоминаний в iPhone. Листы действий появляются как модальные окна, выскальзывающие снизу в тех случаях, когда какая-либо операция требует привлечения внимания пользователя. Чаще всего их можно увидеть на предустановленных на iPhone приложениях при попытке пользователя удалить несколько элементов или важные данные, например, голосовую почту. Листы действий могут быть запрограммированы задавать пользователю любые вопросы и предоставлять ему любое количество различных вариантов действий. Они весьма полезны в тех частях приложений, которые требуют немедленной реакции.

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

Строка состояния (status bar)— это небольшая панель, расположенная наверху экрана iPhone и отображающая время, уровень зарядки батареи и качество сигнала. Цвет, прозрачность и положение строки состояния можно менять и настраивать; кроме того, можно сделать так, чтобы строка состояния отображала значки, уведомляющие пользователя о том или ином состоянии приложения.

?         Бейджи приложений. Те приложения, которым необходимо в определенные промежутки времени уведомлять пользователя о каких-либо событиях, имеют возможность отображать на основном экране приложений бейджи (badges). Это позволяет проинформировать пользователя о том. что какое-либо приложение требует внимания, или же о том, что для пользователя имеется сообщение или какая-либо другая информация. Эта возможность очень активно применяется приложениями, использующими для доставки сообщений сеть EDGE.

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

Окна и виды

Основным компонентом пользовательского интерфейса является окно. Окно (window)— это область отображения, рамка изображения, uiwindow— это базовый класс iPhone, порожденный от функций более низкого уровня, отвечающих на события мыши, жесты (gestures) и другие типы событий, относящиеся к этому окну. Класс uiwindow в конечном счете ответственен за хранение содержимого объекта uiview (изображение, которое размещается в рамке окна), uiview является базовым классом, от которого порождены многие другие типы классов экрана. Само по себе окно может только хранить один объект, в то время как объект uiview создан для того, чтобы содержать в себе множество различных типов подобъектов, включая другие виды. Эти два класса идут рука об руку, и оба они должны отображать что-либо на экране iPhone.

Создание окна и вида

Прежде чем вы сможете что-либо отобразить на экране iPhone, вы должны создать окно для хранения содержимого, а чтобы построить окно, вам необходима область отображения. Область отображения (display region)— термин, обозначающий прямоугольник и представляющий часть экрана, в которой должно отображаться окно. Сама же основная структура является структурой прямоугольника CGRect, которая содержит две порции информации: координаты левого верхнего угла окна и размер окна (его ширину и высоту). Каждый объект, отображаемый на экране, имеет область отображения, задающую его часть экрана. Чаще всего области отображения задаются во время инициализации объекта посредством метода initwithFrame. Иначе они должны задаваться после использования вездесущего метода setFrame. В случае основного окна область отсчитывается от самого экрана, однако все последующие объекты (включая вид окна) отсчитываются от объекта, их содержащего. Поскольку все другие объекты являются вложенными в вид, то области их объектов отсчитываются от вида, и т. д.

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

CGRect windowRect = [ UlHardware fullScreenApplicationContentRect ];

Эта область (windowRect) затем используется для создания и инициализации нового объекта uiwindow: UlWindow *window = [ UlWindow alloc ]; [ window initWithContentRect: windowRect ];

Итак, теперь создана рамка окна, но она ничего не содержит. Необходим объект, который сможет визуализировать внутри нее содержимое. Чтобы заполнить окно, должен быть создан объект uiview. Поскольку окно может только хранить один объект вида, то область отображения для него должна точно так же использовать весь экран целиком, чтобы он заполнял все окно: CGRect viewRect = [ UlHardware fullScreenApplicationContentRect ]; viewRect.origin.x = viewRect.origin.у = 0.0;

UlView *mainView = [ [ MainView alloc ] initwithFrame: viewRect ];

Отображение вида

Теперь создана пара — окно и вид, но вид еще не отображен на экране. Для этого определим окно и прикажем окну отобразиться:

window setContentView: mainView ]; ; window orderFront: self ];

[ window makeKey: self ]; [ window _setHidden: NO ];

Самое бесполезное приложение

int main(int argc, char **argv)

Прежде чем мы перейдем к "Hello, World!", нам потребуется еще более бесполезное приложение: "Hello, Window!". Это приложение не делает ничего, кроме как просто создает пару окна и вида. На самом деле, поскольку базовый класс uiview является всего лишь контейнерным классом, то он даже текст не может отобразить. Все, что вы увидите, — это черный экран. Единственное, чем это приложение полезно, — это несколько первых строк кода, которые будет использовать любое приложение GUI на iPhone.

Это приложение, показанное в листингах 3.1 и 3.2/может быть скомпилировано из пакета инструментов с помощью следующей командной строки:

$ arm-apple-darwin9-gcc -о MyExample MyExample.ш -lobjc

-framework CoreFoundation -framework Foundation -framework UIKit

#import <CoreFoundation/CoreFoundation.h> #import <UIKit/UIKit.h>

@interface MyApp : UIApplication {

UlWindow *window; UlView *rnainView;

}

- (void)applicationDidFinishLaunching:

(NSNotification *)aNotification; @end

#import "MyExample.h"

NSAutoreleasePool *autoreleasePool = [ [ NSAutoreleasePool alloc ] init

];

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

}

@implementation MyApp

4

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

];

CGRect windowRect =

[ UIHardware fullScreenApplicationContentRect ]; windowRect.origin.x = windowRect.origin.у = O.Of;

mainView = [ [ Uiview alloc ] initWithFrame: windowRect ];

[  window setContentView: mainView ];

[  window orderFront: self ];

[  window makeKey: self ];

[  window _setHidden: NO ];

«end

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

Приложение "Hello, Window!" работает следующим образом:

I. При запуске приложения вызывается его функция main(), точно так же, как это происходит в обычной С-программе. Происходит переход в страну Objective-C и порождение класса МуАрр, являющегося производным от класса UlApplication UIKit. Функция main() также отвечает за инициализацию автоматически освобождаемого пула (auto-release pool). Автоматически освобождаемые пулы широко применяются в платформе Cocoa для освобождения объектов, которые при своем создании были построены как autorelease. Тем самым приложению указывается просто уничтожить их после того, как отпадет надобность в них, и освободить занимаемые ими ресурсы.

2.     Метод applicationDidFinishLaunching класса UIApplication вызывается основной платформой объекта приложения после инициализации объекта. Именно в этом месте зарождается жизнь приложения Objective-C.

3.     Метод fullScreenApplicationContentRect класса UlHardware вызывается для того, чтобы вернуть координаты и размер физического экрана. Затем это используется для создания нового окна, в котором хранится основной вид приложения.

4.     Далее создается основной вид с использованием области отображения, начинающейся в точке (0, 0) — левый верхний угол окна. Вид становится содержимым окна.

5.     Затем окну дается команда перейти на передний план и отобразиться. Таким образом, отображается вид, который на данный момент не имеет содержимого.

Порождение от UlView

Пример "Hello, World!" показал нам, как мало кода необходимо для создания и отображения пары "окно/вид". Поскольку сам по себе класс uiview является всего лишь базовым классом, то он ничего не отображает. Чтобы создать полезное приложение, можно породить от uiview новый класс, подменив его методы для добавления функциональности. Этот управляющий вид может затем отображать другие объекты, например, текстовые поля, изображения и т. д.

Чтобы породить подкласс от uiview, напишите новые интерфейс и реализацию, объявляющие подкласс. Приведенный далее фрагмент кода создает

ПОДКЛаСС MainView:

^interface MainView : UlView {

}

-   (id)initwithFrame:(CGRect)rect;

-   (void)dealloc; @end

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

Эти два метода являются основой для всех других действий в пределах класса вида. Вот шаблоны для них:

@implementation MainView

-   (id)initwithFrame:(CGRect)rect {

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

/* Здесь инициализируются переменные экземпляра */ /* Здесь выделяются первоначальные ресурсы */

}

return self;

}

-   (void)dealloc

/* Здесь освобождаются все ресурсы */ [ self dealloc ]; [ super dealloc ];

3end

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

По теме:

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