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


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



Friday, July 1, 11
Содержание
                              От простого к сложному

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



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
CALayer
                     1. Любая UIView содержит один либо несколько
                        CALayer, которые отображают ее собержимое.
                     2. Общие черты: Иерархия CALayer’ов ≈ иерархия
                        UIView, занимаются отображением графики.
                     3. Отличия: CALayer не занимается обработкой
                        действий пользователя.




Friday, July 1, 11
Glow-эффект
              Используем возможность устанавливать тень для
                               CALayer:
            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);




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

Fun with core graphics

  • 1.
    Fun with CoreGraphics как сделать презентационное приложение нескучным Герасименко Михаил Project Manager, Team Lead 24.06.2011 Friday, July 1, 11
  • 2.
    Содержание От простого к сложному 1. Нестандартные шрифты 2. Переключение локализации в приложении 3. Скринсейвер 4. CALayer: Glow эффект 5. CALayer: 3D Transform + Animation 6. CAVideoLayer 7. Прокрутка видео Friday, July 1, 11
  • 3.
    Нестандартные шрифты 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
  • 4.
    Переключение локализации в приложении Бандл (Bundle) = директория (Folder) Типы бандлов: 1. Бандл приложения. 2. Бандл ресурсов. 3. Бандл файла проекта Xcode. 4. Бандл локализации (lproj). 5. ... Friday, July 1, 11
  • 5.
    Переключение локализации в приложении 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
  • 6.
    Скринсейвер 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
  • 7.
    CALayer 1. Любая UIView содержит один либо несколько CALayer, которые отображают ее собержимое. 2. Общие черты: Иерархия CALayer’ов ≈ иерархия UIView, занимаются отображением графики. 3. Отличия: CALayer не занимается обработкой действий пользователя. Friday, July 1, 11
  • 8.
    Glow-эффект Используем возможность устанавливать тень для CALayer: 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); Friday, July 1, 11
  • 9.
    CALayer: 3D Transform+ Animation UIView transform: Аффинное преобразование, двумерное. Можно анимировать. CALayer transform: Аффинное преобразование, но уже трехмерное. Так же есть возможность анимировать. Friday, July 1, 11
  • 10.
    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
  • 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
  • 12.
    Прокрутка видео - (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
  • 13.
    Спасибо за внимание! ул. Михайловская 25 Одесса 65005, Украина www.softtechnics.biz Friday, July 1, 11