Upload
softtechnics
View
1.701
Download
4
Embed Size (px)
DESCRIPTION
M.Gerasimenko, PM at SoftTechnics
Citation preview
Fun with CoreGraphicsкак сделать презентационное приложение
нескучным
Герасименко МихаилProject Manager, Team Lead
24.06.2011
Friday, July 1, 11
Содержание
1. Нестандартные шрифты2. Переключение локализации в приложении3. Скринсейвер4. CALayer: Glow эффект5. CALayer: 3D Transform + Animation6. CAVideoLayer7. Прокрутка видео
От простого к сложному
Friday, July 1, 11
Нестандартные шрифты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
Переключение локализации в приложении
Бандл (Bundle) = директория (Folder)
Типы бандлов:1. Бандл приложения.2. Бандл ресурсов.3. Бандл файла проекта Xcode.4. Бандл локализации (lproj).5. ...
Friday, July 1, 11
Переключение локализации в приложении
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
Скринсейвер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
CALayer1. Любая UIView содержит один либо несколько
CALayer, которые отображают ее собержимое.2. Общие черты: Иерархия CALayer’ов ≈ иерархия
UIView, занимаются отображением графики.3. Отличия: CALayer не занимается обработкой действий пользователя.
Friday, July 1, 11
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
CALayer: 3D Transform + Animation
UIView transform:
Аффинное преобразование, двумерное. Можно анимировать.
CALayer transform:
Аффинное преобразование, но уже трехмерное. Так же есть возможность анимировать.
Friday, July 1, 11
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
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
Прокрутка видео- (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
Спасибо за внимание!
ул. Михайловская 25Одесса 65005, Украина
www.softtechnics.biz
Friday, July 1, 11