Главная » iPhone » Переходные виды iPhone

0

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

Создание перехода

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

UITransitionView *transitionView = [ [ UITransitionView alloc ] initwithFrame: viewRect ];

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

UITransitionyiew *transitionView = [ [ UITransitionView alloc ] initwithFrame:

CGRectMake(viewRect.origin.x, viewRect.origin.у + 48.0, viewRect.size.width, viewRect.size.height48.0

];

После того как переход создан, он добавляется в вид таким же способом, что и другие объекты вида, в качестве подуровня:

; self addSubview: transitionView ];

Вызов перехода

Чтобы выполнить переход, вызовите метод transition класса. Вы передаете в него стиль перехода и указатели на два вида, между которыми осуществляется переход:

transitionView transition: 0 fromView: myOldView toView: myNewView

• .

- f .

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

[ transitionView transition: 0 toView: myNewView ];

UIKit на сегодняшний день поддерживает 10 различных переходов. Единичный переходный вид может вызываться неоднократно с различными стилями, перечисленными в табл. 3.3. Это позволяет разработчикам выбирать наиболее подходящий переход в зависимости от конкретного действия, не беспокоясь о создании нового объекта для каждого возможного перехода, который они захотят выполнить.

Таблица 3.3

Стиль

Описание

0

Нет перехода/быстрый переход

1

Страницы прокручиваются влево

2

Страницы прокручиваются вправо

3

Страницы прокручиваются вверх

4

Старая страница отгибается вверх, новая страница отгибается вниз

5

Старая страница отгибается вниз, новая страница отгибается вверх

6

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

7

Страницы прокручиваются вниз

8

Новая страница отгибается поверх старой

9

Новая страница отгибается вниз поверх старой

Пример: переворачивание страниц

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

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

$ arm-apple-darwin9-gcc -о MyExample MyExample.m -lobjc ^

-framework CoreFoundation -framework Foundation -framework UIKit

# import <CoreFoundat ion/CoreFoundation.h> #import <UIKit/UIKit.h> #import <UIKit/UINavigationBar.h> #import <UIKit/UiNavigationitem.h> #import <UIKit/UITransitionView.h> #import <UIKit/UITextView.h>

tdefine MAX_PAGES 10

@interface MainView : UlView

{

UINavigationBar *navBar; UiNavigationitem *navltem; UITransitionView *transView; int pageNum;

/* Наша панель навигации */

/* Заголовок панели навигации */

/* Наш переход */

/* Номер текущей страницы */

/* Несколько страниц для прокручивания */ UITextView *textPage[MAX_PAGES];

}

-   (id)initwithFrame:(CGRect)frame;

-   (void)dealloc;

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

-   (void)setNavBar;

-   .void)navigationBar:(UINavigationBar *)navbar

buttonClicked:(int)button;

-    void)f1ipTo:(int)page;

«end

@interface MyApp : UIApplication

{                                                                                                                  • – ? л- ‘J.

Uiwindow ^window;

MainView *mainView;

}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification; Send

#import "MyExample.h"

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

NSAutoreleasePool *autoreleasePool = [ [ NSAutoreleasePool alloc ] ini-t

];

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

)

@implementation MyApp

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

];

CGRect rect = t UIHardware 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 ];

}

@end

@implementation MainView – (id)initwithFrame:(CGRect)rect {

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

CGRect viewRect; int i;

/* Создаем новый порт вида под панелью навигации */ viewRect = CGRectMake(rect.origin.x, rect.origin.у + 48.0, rect.size.width, rect.size.height – 48.0);

/* Устанавливаем нашу начальную страницу */ pageNum – МАХ_PAGES / 2;

/* Создаем десять объектов UiTextview в качестве страниц

в нашей книге */ for(i=0;i<MAX_PAGES;i++) {

textPage[i] = [ [ UiTextview alloc ]

initwithFrame: rect ]; [ textPage[i] setText: [ [ NSString alloc ] initWithFormat: @"Some text for page %d", i+1 ] ];

}

/* Создаем панель навигцаии с кнопками Prev и Next */ navBar = [ self createNavBar: rect ]; [ self setNavBar ]; [ self addSubview: navBar ];

/* Создаем наш переходный вид */ transView = [ [ UITransitionView alloc ]

initWithFrame: viewRect ]; [ self addSubview: transView ];

/* Переход к первой странице */ [ self flipTo: pageNum ];

}

return self;

}

-     (void)dealloc {

[ navBar release ]; [ 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)

];

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

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

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

[ newNav showLeftButton:@"Prev" withStyle: 0

rightButton:@"Next" withStyle: 0 ];

return newNav;

}

-    (void)setNavBar {

/* Делаем доступными или недоступными наши кнопки страниц */ if (pageNum == i)

[ navBar setButton: 1 enabled: NO ]; else

[ navBar setButton: 1 enabled: YES ];

if (pageNum = MAX_PAGES)

[ navBar setButton: 0 enabled: NO ]; else

[ navBar setButton: 0 enabled: YES ];

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

/* Следующая страница */

if (button ==0) {

[ self flipTo: pageNum+1 ];

/* Предыдущая страница */ else {

[ self flipTo: pageNum-1 ];

}

- void)flipTo:(int)page (

int transitionNum; /* Какой номер перехода должен быть использован? */

if (page < pageNum)

transitionNum = 2; else if (page > pageNum)

transitionNum = 1; else

transitionNum = 0;

[ transView transition: transitionNum

fromView: textPage[pageNum-1] toView: textPage[page-1] J;

pageNum = page;

[ self setNavBar ] ;

)

@end

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

Вот как работает пример с переворачиванием страниц:

1.     При порождении приложения создается объект MainView и вызывается его метод initWithFrame. Тем самым создаются десять объектов uiTextview, которые станут примерами страниц книги, а затем он создает панель навигации и один объект перехода. Наконец, вызывается образец метода flipTo, который отвечает за переворачивание страниц до указанного номера страницы.

2.     Метод flipTo выбирает стиль перехода, основываясь на том, является ли страница, к которой надо перейти, предыдущей или последующей.

3.     После определения того, какой переход использовать, метод flipTo вызывает переходный вид, чтобы проделать всю работу по перемещению к требуемой странице. Затем он устанавливает действующий номер страницы, являющийся переменной в классе.

4.      Когда пользователь нажимает кнопку перехода Prev или кнопку перехода Next, то вызывается метод buttonClicked с указателем на панель навигации и номер нажатой кнопки. Здесь снова вызывается метод flipTo для перехода к новой странице и для того, чтобы сделать нажатую кнопку перехода недоступной, в случае, если достигнут конец книги.

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

Вот несколько весьма полезных моментов, которые можно реализовать с помощью примера с переворачиванием страниц.

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

?         Воспользуйтесь примером с переворачиванием страниц и заполните каждое поле с рамкой произвольным набором символов ASCII. Теперь напишите быстрый переход через все 10 страниц, чтобы создать анимацию ASCII, которая подражает старинному кинопроектору.

?         Проверьте наличие прототипов UITransitionView.h в каталоге вашего пакета инструментов include. Вы найдете их в папке /toolchain/sys/usr/include/UIKit/.

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

По теме:

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