Главная » iPhone » Отображение перехода уровней iPhone

0

После того как анимация Quartz Core будет настроена, она выполняется посредством объекта UiTransitionView. Прежде чем вызовется метод переходного вида transition, анимация сначала должна привязаться к виду, который будет анимироваться. Чтобы анимировать все содержимое экрана, анимация может быть применена к основному виду. Это приведет к тому, что все объекты, принадлежащие виду, например, панели навигации и кнопки, будут включены в анимацию. Если вы работаете с небольшими объектами, например uiTextview или uiPushButton, то примените анимацию к самому переходному виду. В результате этого будут задействованы только небольшие объекты:

[ [ transitionView _layer ] addAnimation: animation forKey: 0 ];

Эта строка добавляет анимацию к уровню так, что при его переходе анимация Quartz Core будет выполняться на месте перехода #0. Теперь осталось только одно — вызвать переход:

[ transitionView transition: 0 toView: newView ];

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

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

Данный пример может быть скомпилирован с использованием пакета инструментов с помощью следующей командной строки:

$ arm-apple-darwin9-gee -о MyExampIe MyExample.m -lobje ^ -framework UIKit -framework CoreSurface -framework Co re Foundation -framework QuartzCore -framework Foundation

Листинги 5.3 и 5.4 содержат код для новой версии программы переворачивания страниц.

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

# import <UIKit/UITransitionView.h> #import <UIKit/UITextView.h>

# import <QuartzCore/CATransition.h> #import <QuartzCore/CAAnimation.h> #define MAX_PAGES 10

@interface MainView : UlView {

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

UINavigationltem *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)flipTo:(int)page;

8 end

3interface MyApp : UIApplication

{

UlWindow *window; MainView *mainView;

}

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

#import "MyExample.h"

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

NSAutoreleasePool *autoreleasePool = [ [ NSAutoreleasePool alloc ] init

]?

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

}

$implementation MyApp

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

t UIHardware fullScreenApplicationContentRect ]

];

CGRect rect = [ UIHardware fullScreenApplicationContentRect ];

rect.origin.x = rect.origin.у = O.Of;

mainView = [ [ MainView alloc ] initWithFrame: rect J;

[ 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 = MAX_?AGES / 2;

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

for(i=0;i<MAX_PAGES;i++) {

textPage[i] = [ [ UITextView alloc ] initwithFrame: rect ]; [ textPage[i] setText: [ [ NSString alloc ] initWithFormat: @"This is some text for page %d", i+1 ] J;

}

/* Создаем панель навигации с кнопками 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.Of)

] ;

[ 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 == 1)

[ 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 {

CAAnimation *animation = [ CATransition animation ]; [ animation setType: @"oglFlip" J; [ animation setSubtype: @"fromLeft" ]; f animation setTimingFunction:

[ CAMediaTimingFunction functionWithName: @"easeOut" ] ]; [ animation setFillMode: @"extended" ]; [ animation setTransitionFlags: 3 ]; [ animation setSpeed: 0.50 ];

( t self _layer ] addAnimation: animation forKey: 0 ];

[ transView transition: 0 toView: textPage[page-1] ]; pageNum = page; [ self setNavBar ];

iend

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

Данный пример работает совершенно аналогично примеру из листингов 3.9 и ЗЛО.

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

2.     Метод flipTo создает объект CAAnimation и добавляет его к уровню основного вида. Затем он вызывает переходной вид, чтобы проделать работу по запуску анимации, одновременно перемещаясь к требуемой странице. Анимация уровня основного вида используется автоматически, в результате чего осуществляется переход содержимого всего основного вида вместо простого переворачивания страницы.

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

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

Проверьте наличие прототипов CALayer.h, CAAnimation.h и CATransition.il в каталоге вашего пакета инструментов include. Вы найдете их в папке /toolchain/sys/usr/include/QuaitzCore.

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

По теме:

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