13
Fun with CoreGraphics как сделать презентационное приложение нескучным Герасименко Михаил Project Manager, Team Lead 24.06.2011 Friday, July 1, 11

Fun with core graphics

Embed Size (px)

DESCRIPTION

M.Gerasimenko, PM at SoftTechnics

Citation preview

Page 1: Fun with core graphics

Fun with CoreGraphicsкак сделать презентационное приложение

нескучным

Герасименко МихаилProject Manager, Team Lead

24.06.2011

Friday, July 1, 11

Page 2: Fun with core graphics

Содержание

1. Нестандартные шрифты2. Переключение локализации в приложении3. Скринсейвер4. CALayer: Glow эффект5. CALayer: 3D Transform + Animation6. CAVideoLayer7. Прокрутка видео

От простого к сложному

Friday, July 1, 11

Page 3: Fun with core graphics

Нестандартные шрифты1. Добавляем файл .ttf в проект.2. Добавляем в Info.plist ключ UIAppFonts (NSArray), содержащий названия шрифтов:

<key>UIAppFonts</key><array>! ! <string>c063002t.ttf</string></array>

3. Используем в UIFont (UILabel, UIButton, etc):[UIFont fontWithName:@"CorpoSLig" size:Size];

В UIWebView:font-family: CorpoSLig, Arial, sans-serif;

В CoreText:NSData *data = [[NSData alloc] initWithContentsOfFile:fontPath];CGDataProviderRef fontProvider = CGDataProviderCreateWithCFData(data);[data release];!CGFontRef cgFont = CGFontCreateWithDataProvider(fontProvider);

!

Friday, July 1, 11

Page 4: Fun with core graphics

Переключение локализации в приложении

Бандл (Bundle) = директория (Folder)

Типы бандлов:1. Бандл приложения.2. Бандл ресурсов.3. Бандл файла проекта Xcode.4. Бандл локализации (lproj).5. ...

Friday, July 1, 11

Page 5: Fun with core graphics

Переключение локализации в приложении

NSString *path = [[NSBundle mainBundle] pathForResource:current ofType:@"lproj"];

self.bundle = [[NSBundle bundleWithPath:path] retain];

...

- (NSString *)localizedStringForKey:(NSString *)key comment:(NSString*)comment {! return [self.bundle localizedStringForKey:key value:nil table:nil];}

...

#define MYLocalizedString(key, commenta) \! [[MYLocalization sharedLocalization] localizedStringForKey:(key) comment:(commenta)]

...

genstrings -s MYLocalizedString ...

Friday, July 1, 11

Page 6: Fun with core graphics

Скринсейвер1. Subclass UIWindow.

@implementation CWindow

#if kCLScreensaverEnabled- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {

![NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showScreenSaver) object:nil];

![self performSelector:@selector(showScreenSaver) withObject:nil afterDelay:kCLScreensaverDelay];!!return [super pointInside:point withEvent:event];}

- (void)showScreenSaver {![AppDelegate() setScreensaverShowed:YES];}#endif

@end

2. Установить в MainWindow.xib наш класс для window.

Friday, July 1, 11

Page 7: Fun with core graphics

CALayer1. Любая UIView содержит один либо несколько

CALayer, которые отображают ее собержимое.2. Общие черты: Иерархия CALayer’ов ≈ иерархия

UIView, занимаются отображением графики.3. Отличия: CALayer не занимается обработкой действий пользователя.

Friday, July 1, 11

Page 8: Fun with core graphics

Glow-эффект

UIView* myView;

CALayer* Layer = myView.layer;

Layer.shadowColor = MegatronColor().CGColor;Layer.masksToBounds = false;Layer.shadowOpacity = 1.0f;Layer.shadowRadius = Intensity;Layer.shouldRasterize = true;Layer.shadowOffset = CGSizeMake(0, 0);

Используем возможность устанавливать тень для CALayer:

Friday, July 1, 11

Page 9: Fun with core graphics

CALayer: 3D Transform + Animation

UIView transform:

Аффинное преобразование, двумерное. Можно анимировать.

CALayer transform:

Аффинное преобразование, но уже трехмерное. Так же есть возможность анимировать.

Friday, July 1, 11

Page 10: Fun with core graphics

Transform+Animate: UIView *superView = [[UIApplication sharedApplication] keyWindow];

!! [UIView beginAnimations:nil context:NULL];! [UIView setAnimationDuration:0.7];! [UIView setAnimationDelegate:self];! [UIView setAnimationDidStopSelector:@selector(firstAnimationDidStop:finished:context:)];! [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];!! CALayer *layer = superView.layer;! CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;! rotationAndPerspectiveTransform.m34 = 1.0 / -5000;

rotationAndPerspectiveTransform =! ! CATransform3DRotate(rotationAndPerspectiveTransform, 90.0f * M_PI /! ! ! ! ! ! ! 180.0f, 1.0f, 0.0f, 0.0f);! !! rotationAndPerspectiveTransform =! CATransform3DScale(rotationAndPerspectiveTransform, 0.92, 0.92, 1);! layer.transform = rotationAndPerspectiveTransform;! [UIView commitAnimations];

Friday, July 1, 11

Page 11: Fun with core graphics

CAVideoLayer@interface CVideoView : UIView@property (nonatomic, retain) AVPlayer* Player;@end

@implementation CVideoView@synthesize Player;

-(void) dealloc { self.Player = nil; [super dealloc];}

+(Class) layerClass { return [AVPlayerLayer class];}

-(AVPlayer*) Player { return [(AVPlayerLayer*)[self layer] player];}

-(void) setPlayer:(AVPlayer*)player{ [(AVPlayerLayer*)[self layer] setPlayer:player];}@end

Friday, July 1, 11

Page 12: Fun with core graphics

Прокрутка видео- (void)stepByFloatCount:(float)count {

! self.step+= count;!! float stepRound = roundf(self.step);!! if (fabs(stepRound) >= 1.0) {! ! [self stepByCount:stepRound];! ! self.steps+= stepRound;! ! self.step = self.step - stepRound;

}}

...

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

! CGPoint endPoint = [[touches anyObject] locationInView:self.view];CGPoint dp = CGPointMake(self.startPoint.x - endPoint.x,

! ! ! ! ! ! ! ! self.startPoint.y - endPoint.y);

[self.currentItem stepByFloatCount:kCLVideoDefaultStep * dp.y];!}

Friday, July 1, 11

Page 13: Fun with core graphics

Спасибо за внимание!

ул. Михайловская 25Одесса 65005, Украина

www.softtechnics.biz

Friday, July 1, 11