Главная » iPhone » Преобразования уровней iPhone

0

Возможности Quartz Core по выводу на экран позволяют свободно манипулировать 20-изображениями, как если бы они были ЗЭ-изображениями. Изображение можно вращать на любой угол в осях л", у, z, масштабировать и наклонять. Объект CATransform— это магия под покровом технологии Cover Flow от Apple. Настольные системы Apple используют платформу Core Animation для обработки преобразований 3D. Платформа Quartz Core для iPhone использует многие подобные функции. iPhone поддерживает масштаб.

вращение, аффинные и параллельные преобразования. Более подробную информацию об этих различных преобразованиях можно найти в Core Animation Programming Guide от Apple, расположенном на Web-узле Apple Developer Connection.

Преобразование осуществляется для отдельных уровней. Платформа Quarts Core выполняет преобразования с помощью объекта CATransform. Этот объект применяется к уровню вида, чтобы повернуть или каким-либо другим способом трансформировать его уровень в требуемую конфигурацию 3D. Приложение же продолжает рассматривать данный объект как объект 2D, но при отображении пользователю этот объект соответствует тем преобразованиям, которые были применены к уровню. В приведенном далее примере создается преобразование для вращения уровня: CATransform myTransform;

.-./Transform = CATransform3DMakeRotation(angle, x, y, z);

Метод CATransform3DMakeRotation создает преобразование, которое повернет уровень на количество радиан, определяемое angle, с использованием осей х, у, z. Значения х, у, z задают ось и величину каждого пространства между -I и +1). Присвоение значения какой-либо оси указывает преобразованию осуществить поворот с использованием именно этой оси. Например, .ели ось х установлена либо в -1, либо в +1, то объект будет повернут по оси в данном направлении, т. е. он будет повернут вертикально. Рассматривайте •ти значения как вставку соломинок в изображение вдоль каждой оси. Если соломинка вставлена сквозь ось х, то изображение будет вращаться вокруг соломинки по вертикали. Более сложные повороты можно создавать с помо- ью значения углов осей. Однако в большинстве случаев значений -1 и +1 юлне достаточно.

• обы повернуть уровень на 45° по его горизонтальной оси (вертикальное ?ащение), можно использовать следующий код:

г ransform = CATransform3DMakeRotation(0.78, 1.0, 0.0, 0.0);

1 >бы повернуть уровень на 45° горизонтально, укажите соответствующее ачение для оси>>:

«у : a.nsform = CATransform3DMakeRotation(0.78, 0.0, 1.0, 0.0);

I . юльзованное выше значение 0,78 представляет радианное значение угла. 4i оы пересчитать градусы в радианы, воспользуйтесь простой формулой: – 180. Например, 45тг/180 = 45×3,1415/180 = 0,7853.

После создания преобразования оно применяется к соответствующему уровню. Чтобы получить доступ к этому уровню, воспользуйтесь методом layer внутри любого объекта вида, чтобы получить его объект CALayer. Объект CALayer имеет метод setTransform, который вы используете для присоединения к нему преобразования. Тем самым указывается уровню выполнить заданное преобразование:

[ [ imageView _layer ] setTransform: myTransform ];

Пример: демонстрация вращения фонового рисунка

В данном примере используется преобразование CATransform3DMakeRotate из Quartz Core для вращения фонового рисунка рабочего стола несколькими различными способами по осям х, у и z. Фоновый рисунок загружается в класс uiAutocorrectimageview, который используется для уменьшения размера изображения в два раза (более детально это будет описано в главе 7). Затем используется таймер для осуществления вращения изображения каждые 0,01 секунд и изменением оси в конце каждого поворота на 360°.

Чтобы скомпилировать данный пример, воспользуйтесь пакетом инструментов в командной строке:

@interface MainView : UlView {

UiAutocorrectimageview *imageView;

$ arm-apple-darwin9-gcc -о MyExample MyExample.m -lobje -framework Foundation -framework CoreFoundation -framework UIKit ^ -framework QuartzCore

В листингах 5.5 и 5.6 приведен соответствующий код.

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

CATransform transform; NSTimer * timer;

float angle, x, y, z;

}

-    (id)initWithFrame:(CGRect)frame;

-    (void) handleTimer: (NSTimer *) timer;

-    (void)dealloc;

@end

@interface MyApp : UiApplication {

UlWindow *window; MainView *mainView;

}

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

#import <UIKit/UIKit.h>

#import <UIKit/UIAutocorrectImageView.h>

#iirport "MyExample.h"

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

NSAutoreleasePool *autoreleasePool = [ [ NSAutoreleasePool alloc ] init

];

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

) @implementation МуАрр

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

[ UlHardware fullScreenApplicationContentRect ]

];

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 ];

}

@end

@implementation MainView

-    (id)initwithFrame:(CGRect)rect {

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

angle = у = z = 0; x = 1;

templmage = [ Ullmage defaultDesktopImage ];

imageView = [ [ objc_getClass("UIAutocorrectlmageView") alloc ] initwithFrame: CGRectMake(80, 120, 160, 240) image: templmage ]; [ [ self _layer ] addSublayer: [ imageView _layer ] ];

transform = CATransform3DMakeRotation(angle, x, y, z); [ imageView _layer ].transform = transform;

[ self setNeedsDisplay ];

timer = [ NSTimer scheduledTimerWithTimelnterval: 0.01 target: self

selector: @selector(handleTimer:) userlnfo: nil repeats: YES ];

}

return self;

}

- (void) handleTimer: (NSTimer *) timer {

angle += 0.01; if (angle > 6.283) { angle = 0; if (z = 1) { x = 0;

}

else {

if (У == 1) { z = 1;

}

у = 1;

}

}

[ [ imageView _layer] setTransform: CATransform3DRotate(transform, angle, x, y, z)

- (void)dealloc {

[ imageView release ]; [ self dealloc ]; [ super dealloc ];

}

@end

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

Демонстрация преобразования работает следующим образом:

1.         При порождении приложения создается объект MainView и вызывается его метод initWithFrame.

2.          В результате инициализируется угол осей х, у, z, ив uiAutocor rect ImageView загружается фоновый рисунок рабочего стола, где его размер уменьшается в половину. Данное изображение отображается в середине экрана.

3.         Запускается таймер, чтобы каждые 0,01 секунд вызывать метод handleTimer. С каждым тиком таймера угол увеличивается и после достижения 360° (6,283 радиан) переворачивается.

4.         С помощью метода CATransform3DRotate преобразование модифицируется и применяется к уровню. Это приводит к ощущению вращения изображения в центре экрана.

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

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

Чуть глубже изучите преобразования и попробуйте выполнить следующие

упражнения.

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

?         Посетите http://en.wikipedia.org/wiki/Axis_angle, где объясняется, как работают осевые углы. Это может пригодиться при разработке собственных преобразований вращения.

?         Изучите Apple’s Core Animation guide на Web-узле Apple Developer Connection. Функции Core Animation отображают функции Quartz Core в iPhone. Это руководство можно найти по адресу:

http://developer.apple.com/docunientation/Cocoa/ConceptuaI/ CoreAnimation_guide/.

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

По теме:

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