SlideShare a Scribd company logo
CORE ANIMATION
                             Animated UIs on the iPhone




Monday, October 12, 2009
WHY ANIMATE?


               Animation brings ‘real world’ feel to user interfaces

               Provides clues to what is happening in the UI

               Makes the UI feel more responsive




Monday, October 12, 2009
PLEAS DON’T




               Make your UI Animated just for the sake of animation




Monday, October 12, 2009
WHAT IS IT ANYWAY?




               Compositing




Monday, October 12, 2009
WHAT IS IT ANYWAY?




               Animation




Monday, October 12, 2009
WHAT IS IT ANYWAY?




               Animation




Monday, October 12, 2009
WHAT IS IT ANYWAY?




               Backend for all animation on the iPhone and Mac




Monday, October 12, 2009
BACKEND




               Simple Stuff is very Simple




Monday, October 12, 2009
BACKEND




               Complex Stuff is Possible




                                           image from @pagedooley



Monday, October 12, 2009
SIMPLE STUFF FIRST
    - (void)touchesEnded:(NSSet *)touches         Begin Animations
               withEvent:(UIEvent *)event {
      [UIView beginAnimations:@"imageMove" context:NULL];
      CGPoint location = [[touches anyObject]
                               locationInView:self.view];
      self.imageView.center = location;
      [UIView commitAnimations];
    }




Monday, October 12, 2009
SIMPLE STUFF FIRST
    - (void)touchesEnded:(NSSet *)touches
               withEvent:(UIEvent *)event {
      [UIView beginAnimations:@"imageMove" context:NULL];
      CGPoint location = [[touches anyObject]
                               locationInView:self.view];
      self.imageView.center = location;
      [UIView commitAnimations];                   Calculate   and set
    }
                                                   the new location




Monday, October 12, 2009
SIMPLE STUFF FIRST
    - (void)touchesEnded:(NSSet *)touches
               withEvent:(UIEvent *)event {
      [UIView beginAnimations:@"imageMove" context:NULL];
      CGPoint location = [[touches anyObject]
                               locationInView:self.view];
      self.imageView.center = location;
      [UIView commitAnimations];
    }
                                 Start the animations




Monday, October 12, 2009
REAL WORLD USAGE



               Animate the Search bar
               into view




Monday, October 12, 2009
ANIMATE IN

   - (IBAction)search {
     if(nil == self.searchBar.superview) {
       self.searchBar.frame = CGRectMake(0.0f, -64.0f, 320.0f, 44.0f);
       [self.view addSubview:self.searchBar];
     }
     [UIView beginAnimations:@"SearchBarMoveIn" context:NULL];
     [UIView setAnimationDuration:0.5f];
     CGRect frame = self.searchBar.frame;
     frame.origin.y = 0.0f;
     self.searchBar.frame = frame;
     [self.searchBar becomeFirstResponder];
     [UIView commitAnimations];
   }




Monday, October 12, 2009
ANIMATE IN

   - (IBAction)search {
     if(nil == self.searchBar.superview) {
       self.searchBar.frame = CGRectMake(0.0f, -64.0f, 320.0f, 44.0f);
       [self.view addSubview:self.searchBar];
     }
     [UIView beginAnimations:@"SearchBarMoveIn" context:NULL];
     [UIView setAnimationDuration:0.5f];
     CGRect frame = self.searchBar.frame;
     frame.origin.y = 0.0f;
     self.searchBar.frame = frame;
     [self.searchBar becomeFirstResponder];
     [UIView commitAnimations];
   }




Monday, October 12, 2009
ANIMATE IN

   - (IBAction)search {
     if(nil == self.searchBar.superview) {
       self.searchBar.frame = CGRectMake(0.0f, -64.0f, 320.0f, 44.0f);
       [self.view addSubview:self.searchBar];
     }
     [UIView beginAnimations:@"SearchBarMoveIn" context:NULL];
     [UIView setAnimationDuration:0.5f];
     CGRect frame = self.searchBar.frame;
     frame.origin.y = 0.0f;
     self.searchBar.frame = frame;
     [self.searchBar becomeFirstResponder];
     [UIView commitAnimations];
   }




Monday, October 12, 2009
ANIMATE IN

   - (IBAction)search {
     if(nil == self.searchBar.superview) {
       self.searchBar.frame = CGRectMake(0.0f, -64.0f, 320.0f, 44.0f);
       [self.view addSubview:self.searchBar];
     }
     [UIView beginAnimations:@"SearchBarMoveIn" context:NULL];
     [UIView setAnimationDuration:0.5f];
     CGRect frame = self.searchBar.frame;
     frame.origin.y = 0.0f;
     self.searchBar.frame = frame;
     [self.searchBar becomeFirstResponder];
     [UIView commitAnimations];
   }




Monday, October 12, 2009
ANIMATE IN

   - (IBAction)search {
     if(nil == self.searchBar.superview) {
       self.searchBar.frame = CGRectMake(0.0f, -64.0f, 320.0f, 44.0f);
       [self.view addSubview:self.searchBar];
     }
     [UIView beginAnimations:@"SearchBarMoveIn" context:NULL];
     [UIView setAnimationDuration:0.5f];
     CGRect frame = self.searchBar.frame;
     frame.origin.y = 0.0f;
     self.searchBar.frame = frame;
     [self.searchBar becomeFirstResponder];
     [UIView commitAnimations];
   }




Monday, October 12, 2009
ANIMATE IN

   - (IBAction)search {
     if(nil == self.searchBar.superview) {
       self.searchBar.frame = CGRectMake(0.0f, -64.0f, 320.0f, 44.0f);
       [self.view addSubview:self.searchBar];
     }
     [UIView beginAnimations:@"SearchBarMoveIn" context:NULL];
     [UIView setAnimationDuration:0.5f];
     CGRect frame = self.searchBar.frame;
     frame.origin.y = 0.0f;
     self.searchBar.frame = frame;
     [self.searchBar becomeFirstResponder];
     [UIView commitAnimations];
   }




Monday, October 12, 2009
ANIMATE OUT


    - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
      [self.searchBar resignFirstResponder];
      [UIView beginAnimations:@"SearchBarMoveOut" context:nil];
      [UIView setAnimationDuration:0.5f];
      CGRect frame = self.searchBar.frame;
      frame.origin.y = -CGRectGetHeight(frame);
      self.searchBar.frame = frame;
      [UIView commitAnimations];
    }




Monday, October 12, 2009
ANIMATE OUT


    - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
      [self.searchBar resignFirstResponder];
      [UIView beginAnimations:@"SearchBarMoveOut" context:nil];
      [UIView setAnimationDuration:0.5f];
      CGRect frame = self.searchBar.frame;
      frame.origin.y = -CGRectGetHeight(frame);
      self.searchBar.frame = frame;
      [UIView commitAnimations];
    }




Monday, October 12, 2009
ANIMATE OUT


    - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
      [self.searchBar resignFirstResponder];
      [UIView beginAnimations:@"SearchBarMoveOut" context:nil];
      [UIView setAnimationDuration:0.5f];
      CGRect frame = self.searchBar.frame;
      frame.origin.y = -CGRectGetHeight(frame);
      self.searchBar.frame = frame;
      [UIView commitAnimations];
    }




Monday, October 12, 2009
ANIMATE OUT


    - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
      [self.searchBar resignFirstResponder];
      [UIView beginAnimations:@"SearchBarMoveOut" context:nil];
      [UIView setAnimationDuration:0.5f];
      CGRect frame = self.searchBar.frame;
      frame.origin.y = -CGRectGetHeight(frame);
      self.searchBar.frame = frame;
      [UIView commitAnimations];
    }




Monday, October 12, 2009
DRAWING ATTENTION




               Making elements jump out




Monday, October 12, 2009
SEARCHING



      - (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar {
        [self.gridView animateImagesRelatedTo:searchBar.text];
      }




Monday, October 12, 2009
ANIMATING IMAGES


     - (void)animateImagesRelatedTo:(NSString *)term {
       NSUInteger count = random() % self.gridLayer.images.count;
       if(count < 1) {
         count = 1;
       }
       for(NSUInteger i = 0;i < count;i++) {
         NSUInteger index = random() % self.gridLayer.sublayers.count;
         CALayer *layer = [[self.gridLayer sublayers] objectAtIndex:index];
         [layer addAnimation:[self foundAnimation] forKey:@"emphasise"];
       }
     }




Monday, October 12, 2009
FOUND ANIMATION
  - (CAAnimationGroup *)foundAnimation {
    CAAnimationGroup *foundAnimation = [CAAnimationGroup animation];
    CATransform3D zoomTransform =
         CATransform3DMakeScale(0.75f, 0.75f, 1.0f);

       CABasicAnimation *zoomOutAnimation = [self
            zoomOutAnimation:zoomTransform];
       CAKeyframeAnimation *flipAnimation = [self
            flipAnimation:zoomTransform];
       CABasicAnimation *zoomInAnimation = [self
            zoomInAnimation:zoomTransform];

       foundAnimation.animations = [NSArray
                 arrayWithObjects:zoomOutAnimation,
                                  flipAnimation, zoomInAnimation, nil];
       foundAnimation.duration = 2.0f;

       return foundAnimation;
  }


Monday, October 12, 2009
FOUND ANIMATION
  - (CAAnimationGroup *)foundAnimation {
    CAAnimationGroup *foundAnimation = [CAAnimationGroup animation];
    CATransform3D zoomTransform =
         CATransform3DMakeScale(0.75f, 0.75f, 1.0f);

       CABasicAnimation *zoomOutAnimation = [self
            zoomOutAnimation:zoomTransform];
       CAKeyframeAnimation *flipAnimation = [self
            flipAnimation:zoomTransform];
       CABasicAnimation *zoomInAnimation = [self
            zoomInAnimation:zoomTransform];

       foundAnimation.animations = [NSArray
                 arrayWithObjects:zoomOutAnimation,
                                  flipAnimation, zoomInAnimation, nil];
       foundAnimation.duration = 2.0f;

       return foundAnimation;
  }


Monday, October 12, 2009
FOUND ANIMATION
  - (CAAnimationGroup *)foundAnimation {
    CAAnimationGroup *foundAnimation = [CAAnimationGroup animation];
    CATransform3D zoomTransform =
         CATransform3DMakeScale(0.75f, 0.75f, 1.0f);

       CABasicAnimation *zoomOutAnimation = [self
            zoomOutAnimation:zoomTransform];
       CAKeyframeAnimation *flipAnimation = [self
            flipAnimation:zoomTransform];
       CABasicAnimation *zoomInAnimation = [self
            zoomInAnimation:zoomTransform];

       foundAnimation.animations = [NSArray
                 arrayWithObjects:zoomOutAnimation,
                                  flipAnimation, zoomInAnimation, nil];
       foundAnimation.duration = 2.0f;

       return foundAnimation;
  }


Monday, October 12, 2009
FOUND ANIMATION
  - (CAAnimationGroup *)foundAnimation {
    CAAnimationGroup *foundAnimation = [CAAnimationGroup animation];
    CATransform3D zoomTransform =
         CATransform3DMakeScale(0.75f, 0.75f, 1.0f);

       CABasicAnimation *zoomOutAnimation = [self
            zoomOutAnimation:zoomTransform];
       CAKeyframeAnimation *flipAnimation = [self
            flipAnimation:zoomTransform];
       CABasicAnimation *zoomInAnimation = [self
            zoomInAnimation:zoomTransform];

       foundAnimation.animations = [NSArray
                 arrayWithObjects:zoomOutAnimation,
                                  flipAnimation, zoomInAnimation, nil];
       foundAnimation.duration = 2.0f;

       return foundAnimation;
  }


Monday, October 12, 2009
3 PART ANIMATION




Monday, October 12, 2009
3 PART ANIMATION




Monday, October 12, 2009
ZOOM OUT ANIMATION


  - (CABasicAnimation *)zoomOutAnimation:(CATransform3D)zoomTransform {
    CABasicAnimation *zoomOutAnimation =
            [CABasicAnimation animationWithKeyPath:@"transform"];
    zoomOutAnimation.fromValue =
            [NSValue valueWithCATransform3D:CATransform3DIdentity];
    zoomOutAnimation.toValue =
            [NSValue valueWithCATransform3D:zoomTransform];
    zoomOutAnimation.duration = 0.5f;
    return zoomOutAnimation;
  }




Monday, October 12, 2009
ZOOM OUT ANIMATION


  - (CABasicAnimation *)zoomOutAnimation:(CATransform3D)zoomTransform {
    CABasicAnimation *zoomOutAnimation =
            [CABasicAnimation animationWithKeyPath:@"transform"];
    zoomOutAnimation.fromValue =
            [NSValue valueWithCATransform3D:CATransform3DIdentity];
    zoomOutAnimation.toValue =
            [NSValue valueWithCATransform3D:zoomTransform];
    zoomOutAnimation.duration = 0.5f;
    return zoomOutAnimation;
  }




Monday, October 12, 2009
ZOOM OUT ANIMATION


  - (CABasicAnimation *)zoomOutAnimation:(CATransform3D)zoomTransform {
    CABasicAnimation *zoomOutAnimation =
            [CABasicAnimation animationWithKeyPath:@"transform"];
    zoomOutAnimation.fromValue =
            [NSValue valueWithCATransform3D:CATransform3DIdentity];
    zoomOutAnimation.toValue =
            [NSValue valueWithCATransform3D:zoomTransform];
    zoomOutAnimation.duration = 0.5f;
    return zoomOutAnimation;
  }




Monday, October 12, 2009
FLIP ANIMATION
     - (CAKeyframeAnimation *)flipAnimation:(CATransform3D) zoomTransform {
       CAKeyframeAnimation *flipAnimation = [CAKeyframeAnimation
                                             animationWithKeyPath:@"transform"];
       flipAnimation.beginTime = 0.5f;
       CGFloat rotationVector[3] = {1.0f, 1.0f, 0.0f};
       CATransform3D flipTransform1 =
       CATransform3DRotate(zoomTransform, 1.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       CATransform3D flipTransform2 =
       CATransform3DRotate(zoomTransform, 2.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       CATransform3D flipTransform3 =
       CATransform3DRotate(zoomTransform, 3.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       CATransform3D flipTransform4 =
       CATransform3DRotate(zoomTransform, 4.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       flipAnimation.values = [NSArray arrayWithObjects:
                               [NSValue valueWithCATransform3D:zoomTransform],
                               [NSValue valueWithCATransform3D:flipTransform1],
                               [NSValue valueWithCATransform3D:flipTransform2],
                               [NSValue valueWithCATransform3D:flipTransform3],
                               [NSValue valueWithCATransform3D:flipTransform4],
                               [NSValue valueWithCATransform3D:zoomTransform], nil];
       flipAnimation.duration = 1.0f;
       return flipAnimation;
     }

Monday, October 12, 2009
FLIP ANIMATION
     - (CAKeyframeAnimation *)flipAnimation:(CATransform3D) zoomTransform {
       CAKeyframeAnimation *flipAnimation = [CAKeyframeAnimation
                                             animationWithKeyPath:@"transform"];
       flipAnimation.beginTime = 0.5f;
       CGFloat rotationVector[3] = {1.0f, 1.0f, 0.0f};
       CATransform3D flipTransform1 =
       CATransform3DRotate(zoomTransform, 1.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       CATransform3D flipTransform2 =
       CATransform3DRotate(zoomTransform, 2.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       CATransform3D flipTransform3 =
       CATransform3DRotate(zoomTransform, 3.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       CATransform3D flipTransform4 =
       CATransform3DRotate(zoomTransform, 4.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       flipAnimation.values = [NSArray arrayWithObjects:
                               [NSValue valueWithCATransform3D:zoomTransform],
                               [NSValue valueWithCATransform3D:flipTransform1],
                               [NSValue valueWithCATransform3D:flipTransform2],
                               [NSValue valueWithCATransform3D:flipTransform3],
                               [NSValue valueWithCATransform3D:flipTransform4],
                               [NSValue valueWithCATransform3D:zoomTransform], nil];
       flipAnimation.duration = 1.0f;
       return flipAnimation;
     }

Monday, October 12, 2009
FLIP ANIMATION
     - (CAKeyframeAnimation *)flipAnimation:(CATransform3D) zoomTransform {
       CAKeyframeAnimation *flipAnimation = [CAKeyframeAnimation
                                             animationWithKeyPath:@"transform"];
       flipAnimation.beginTime = 0.5f;
       CGFloat rotationVector[3] = {1.0f, 1.0f, 0.0f};
       CATransform3D flipTransform1 =
       CATransform3DRotate(zoomTransform, 1.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       CATransform3D flipTransform2 =
       CATransform3DRotate(zoomTransform, 2.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       CATransform3D flipTransform3 =
       CATransform3DRotate(zoomTransform, 3.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       CATransform3D flipTransform4 =
       CATransform3DRotate(zoomTransform, 4.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       flipAnimation.values = [NSArray arrayWithObjects:
                               [NSValue valueWithCATransform3D:zoomTransform],
                               [NSValue valueWithCATransform3D:flipTransform1],
                               [NSValue valueWithCATransform3D:flipTransform2],
                               [NSValue valueWithCATransform3D:flipTransform3],
                               [NSValue valueWithCATransform3D:flipTransform4],
                               [NSValue valueWithCATransform3D:zoomTransform], nil];
       flipAnimation.duration = 1.0f;
       return flipAnimation;
     }

Monday, October 12, 2009
FLIP ANIMATION
     - (CAKeyframeAnimation *)flipAnimation:(CATransform3D) zoomTransform {
       CAKeyframeAnimation *flipAnimation = [CAKeyframeAnimation
                                             animationWithKeyPath:@"transform"];
       flipAnimation.beginTime = 0.5f;
       CGFloat rotationVector[3] = {1.0f, 1.0f, 0.0f};
       CATransform3D flipTransform1 =
       CATransform3DRotate(zoomTransform, 1.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       CATransform3D flipTransform2 =
       CATransform3DRotate(zoomTransform, 2.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       CATransform3D flipTransform3 =
       CATransform3DRotate(zoomTransform, 3.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       CATransform3D flipTransform4 =
       CATransform3DRotate(zoomTransform, 4.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       flipAnimation.values = [NSArray arrayWithObjects:
                               [NSValue valueWithCATransform3D:zoomTransform],
                               [NSValue valueWithCATransform3D:flipTransform1],
                               [NSValue valueWithCATransform3D:flipTransform2],
                               [NSValue valueWithCATransform3D:flipTransform3],
                               [NSValue valueWithCATransform3D:flipTransform4],
                               [NSValue valueWithCATransform3D:zoomTransform], nil];
       flipAnimation.duration = 1.0f;
       return flipAnimation;
     }

Monday, October 12, 2009
FLIP ANIMATION
     - (CAKeyframeAnimation *)flipAnimation:(CATransform3D) zoomTransform {
       CAKeyframeAnimation *flipAnimation = [CAKeyframeAnimation
                                             animationWithKeyPath:@"transform"];
       flipAnimation.beginTime = 0.5f;
       CGFloat rotationVector[3] = {1.0f, 1.0f, 0.0f};
       CATransform3D flipTransform1 =
       CATransform3DRotate(zoomTransform, 1.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       CATransform3D flipTransform2 =
       CATransform3DRotate(zoomTransform, 2.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       CATransform3D flipTransform3 =
       CATransform3DRotate(zoomTransform, 3.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       CATransform3D flipTransform4 =
       CATransform3DRotate(zoomTransform, 4.0f * M_PI / 2.0f,
                           rotationVector[0], rotationVector[1], rotationVector[2]);
       flipAnimation.values = [NSArray arrayWithObjects:
                               [NSValue valueWithCATransform3D:zoomTransform],
                               [NSValue valueWithCATransform3D:flipTransform1],
                               [NSValue valueWithCATransform3D:flipTransform2],
                               [NSValue valueWithCATransform3D:flipTransform3],
                               [NSValue valueWithCATransform3D:flipTransform4],
                               [NSValue valueWithCATransform3D:zoomTransform], nil];
       flipAnimation.duration = 1.0f;
       return flipAnimation;
     }

Monday, October 12, 2009
ZOOM IN ANIMATION


  - (CABasicAnimation *)zoomInAnimation:(CATransform3D)zoomTransform {
    CABasicAnimation *zoomInAnimation =
        [CABasicAnimation animationWithKeyPath:@"transform"];
    zoomInAnimation.beginTime = 1.5f;
    zoomInAnimation.fromValue =
        [NSValue valueWithCATransform3D:zoomTransform];
    zoomInAnimation.toValue =
        [NSValue valueWithCATransform3D:CATransform3DIdentity];
    zoomInAnimation.duration = 0.5f;
    return zoomInAnimation;
  }




Monday, October 12, 2009
RUN THE CODE



Monday, October 12, 2009
THANKS

                           Pragmatic iPhone Studio




Monday, October 12, 2009

More Related Content

What's hot

YUI Hidden Gems
YUI Hidden GemsYUI Hidden Gems
YUI Hidden Gems
Andrew Wooldridge
 
Yui mobile
Yui mobileYui mobile
Yui mobile
Gonzalo Cordero
 
Daniel Jalkut - dotSwift 2019
Daniel Jalkut - dotSwift 2019Daniel Jalkut - dotSwift 2019
Daniel Jalkut - dotSwift 2019
DanielJalkut
 
Node meetup feb_20_12
Node meetup feb_20_12Node meetup feb_20_12
Node meetup feb_20_12jafar104
 
YUI for control freaks - a presentation at The Ajax Experience
YUI for control freaks - a presentation at The Ajax ExperienceYUI for control freaks - a presentation at The Ajax Experience
YUI for control freaks - a presentation at The Ajax ExperienceChristian Heilmann
 
Modular and Event-Driven JavaScript
Modular and Event-Driven JavaScriptModular and Event-Driven JavaScript
Modular and Event-Driven JavaScript
Eduardo Shiota Yasuda
 
jQuery Framework - Property Content
jQuery Framework - Property ContentjQuery Framework - Property Content
jQuery Framework - Property Contentjagadeeshm
 
I phone勉強会 (2011.11.23)
I phone勉強会 (2011.11.23)I phone勉強会 (2011.11.23)
I phone勉強会 (2011.11.23)
Katsumi Kishikawa
 
Arquitetura de Front-end em Aplicações de Larga Escala
Arquitetura de Front-end em Aplicações de Larga EscalaArquitetura de Front-end em Aplicações de Larga Escala
Arquitetura de Front-end em Aplicações de Larga Escala
Eduardo Shiota Yasuda
 
YUI Tidbits
YUI TidbitsYUI Tidbits
YUI Tidbits
Jai Santhosh
 
Learning jQuery in 30 minutes
Learning jQuery in 30 minutesLearning jQuery in 30 minutes
Learning jQuery in 30 minutes
Simon Willison
 
14multithreaded Graphics
14multithreaded Graphics14multithreaded Graphics
14multithreaded GraphicsAdil Jafri
 
Unity遊戲程式設計(15) 實作Space shooter遊戲
Unity遊戲程式設計(15) 實作Space shooter遊戲Unity遊戲程式設計(15) 實作Space shooter遊戲
Unity遊戲程式設計(15) 實作Space shooter遊戲
吳錫修 (ShyiShiou Wu)
 
3D Touch by Karol Kozub, Macoscope
3D Touch by Karol Kozub, Macoscope3D Touch by Karol Kozub, Macoscope
3D Touch by Karol Kozub, Macoscope
Macoscope
 
Matching Game In Java
Matching Game In JavaMatching Game In Java
Matching Game In Java
cmkandemir
 
Макс Грибов — Использование SpriteKit в неигровых приложениях
Макс Грибов — Использование SpriteKit в неигровых приложенияхМакс Грибов — Использование SpriteKit в неигровых приложениях
Макс Грибов — Использование SpriteKit в неигровых приложениях
CocoaHeads
 
Desenvolvimento iOS - Aula 4
Desenvolvimento iOS - Aula 4Desenvolvimento iOS - Aula 4
Desenvolvimento iOS - Aula 4
Saulo Arruda
 
2009 Hackday Taiwan Yui
2009 Hackday Taiwan Yui2009 Hackday Taiwan Yui
2009 Hackday Taiwan Yui
JH Lee
 

What's hot (20)

YUI Hidden Gems
YUI Hidden GemsYUI Hidden Gems
YUI Hidden Gems
 
Yui3在美团
Yui3在美团Yui3在美团
Yui3在美团
 
Yui mobile
Yui mobileYui mobile
Yui mobile
 
Daniel Jalkut - dotSwift 2019
Daniel Jalkut - dotSwift 2019Daniel Jalkut - dotSwift 2019
Daniel Jalkut - dotSwift 2019
 
Node meetup feb_20_12
Node meetup feb_20_12Node meetup feb_20_12
Node meetup feb_20_12
 
YUI for control freaks - a presentation at The Ajax Experience
YUI for control freaks - a presentation at The Ajax ExperienceYUI for control freaks - a presentation at The Ajax Experience
YUI for control freaks - a presentation at The Ajax Experience
 
Modular and Event-Driven JavaScript
Modular and Event-Driven JavaScriptModular and Event-Driven JavaScript
Modular and Event-Driven JavaScript
 
jQuery Framework - Property Content
jQuery Framework - Property ContentjQuery Framework - Property Content
jQuery Framework - Property Content
 
I phone勉強会 (2011.11.23)
I phone勉強会 (2011.11.23)I phone勉強会 (2011.11.23)
I phone勉強会 (2011.11.23)
 
Arquitetura de Front-end em Aplicações de Larga Escala
Arquitetura de Front-end em Aplicações de Larga EscalaArquitetura de Front-end em Aplicações de Larga Escala
Arquitetura de Front-end em Aplicações de Larga Escala
 
YUI Tidbits
YUI TidbitsYUI Tidbits
YUI Tidbits
 
Learning jQuery in 30 minutes
Learning jQuery in 30 minutesLearning jQuery in 30 minutes
Learning jQuery in 30 minutes
 
Real life XNA
Real life XNAReal life XNA
Real life XNA
 
14multithreaded Graphics
14multithreaded Graphics14multithreaded Graphics
14multithreaded Graphics
 
Unity遊戲程式設計(15) 實作Space shooter遊戲
Unity遊戲程式設計(15) 實作Space shooter遊戲Unity遊戲程式設計(15) 實作Space shooter遊戲
Unity遊戲程式設計(15) 實作Space shooter遊戲
 
3D Touch by Karol Kozub, Macoscope
3D Touch by Karol Kozub, Macoscope3D Touch by Karol Kozub, Macoscope
3D Touch by Karol Kozub, Macoscope
 
Matching Game In Java
Matching Game In JavaMatching Game In Java
Matching Game In Java
 
Макс Грибов — Использование SpriteKit в неигровых приложениях
Макс Грибов — Использование SpriteKit в неигровых приложенияхМакс Грибов — Использование SpriteKit в неигровых приложениях
Макс Грибов — Использование SpriteKit в неигровых приложениях
 
Desenvolvimento iOS - Aula 4
Desenvolvimento iOS - Aula 4Desenvolvimento iOS - Aula 4
Desenvolvimento iOS - Aula 4
 
2009 Hackday Taiwan Yui
2009 Hackday Taiwan Yui2009 Hackday Taiwan Yui
2009 Hackday Taiwan Yui
 

Viewers also liked

360iDev MapKit Presentation - Denver 2009
360iDev MapKit Presentation - Denver 2009360iDev MapKit Presentation - Denver 2009
360iDev MapKit Presentation - Denver 2009
bdudney
 
Game Kit - iPhone
Game Kit - iPhoneGame Kit - iPhone
Game Kit - iPhonebdudney
 
Creative Ways to Combine Email and Social - Webinar Slides
Creative Ways to Combine Email and Social - Webinar SlidesCreative Ways to Combine Email and Social - Webinar Slides
Creative Ways to Combine Email and Social - Webinar Slides
Vision6
 
Caprice 24-paganini violin solo
Caprice 24-paganini violin soloCaprice 24-paganini violin solo
Caprice 24-paganini violin solo
samuel silva
 
Черенкование хвойников
Черенкование хвойниковЧеренкование хвойников
Черенкование хвойников
Anna Artemyeva
 
Microfiltration - Cryptosporidium Control Application
Microfiltration - Cryptosporidium Control ApplicationMicrofiltration - Cryptosporidium Control Application
Microfiltration - Cryptosporidium Control ApplicationKent Kise
 
Business Professionals Week
Business Professionals WeekBusiness Professionals Week
Business Professionals Week
CPA Australia
 
[제94차 오픈포럼 발제자료] 한국에 창조와 미래가 있는가?_순천대 생물학과 박기영 교수
[제94차 오픈포럼 발제자료] 한국에 창조와 미래가 있는가?_순천대 생물학과 박기영 교수[제94차 오픈포럼 발제자료] 한국에 창조와 미래가 있는가?_순천대 생물학과 박기영 교수
[제94차 오픈포럼 발제자료] 한국에 창조와 미래가 있는가?_순천대 생물학과 박기영 교수
Sci Feel
 
Enterprise and Acumen:Real World Information Skills and Employability for Bus...
Enterprise and Acumen:Real World Information Skills and Employability for Bus...Enterprise and Acumen:Real World Information Skills and Employability for Bus...
Enterprise and Acumen:Real World Information Skills and Employability for Bus...
Western Sydney University
 
Instalación Knoppix
Instalación KnoppixInstalación Knoppix
Instalación Knoppix
Christian Pérez
 
Top 5 challenges in global healthcare it
Top 5 challenges in global healthcare itTop 5 challenges in global healthcare it
Top 5 challenges in global healthcare it
Apollo Hospitals Group and ATNF
 
eTail Asia Perfecting the Fundamentals of Ecommerce 2014 Agenda
eTail Asia Perfecting the Fundamentals of Ecommerce 2014 AgendaeTail Asia Perfecting the Fundamentals of Ecommerce 2014 Agenda
eTail Asia Perfecting the Fundamentals of Ecommerce 2014 Agendadigitalinasia
 
GPSinsights poster
GPSinsights posterGPSinsights poster
GPSinsights poster
Viet-Trung TRAN
 
Social Media and Email Stats from Six Countries
Social Media and Email Stats from Six CountriesSocial Media and Email Stats from Six Countries
Social Media and Email Stats from Six Countries
Kyle Lacy
 
SXSW 2016 Recap: Highlights of Brands and Technologies
SXSW 2016 Recap: Highlights of Brands and TechnologiesSXSW 2016 Recap: Highlights of Brands and Technologies
SXSW 2016 Recap: Highlights of Brands and Technologies
David Berkowitz
 

Viewers also liked (17)

360iDev MapKit Presentation - Denver 2009
360iDev MapKit Presentation - Denver 2009360iDev MapKit Presentation - Denver 2009
360iDev MapKit Presentation - Denver 2009
 
Game Kit - iPhone
Game Kit - iPhoneGame Kit - iPhone
Game Kit - iPhone
 
Creative Ways to Combine Email and Social - Webinar Slides
Creative Ways to Combine Email and Social - Webinar SlidesCreative Ways to Combine Email and Social - Webinar Slides
Creative Ways to Combine Email and Social - Webinar Slides
 
Portfolio
PortfolioPortfolio
Portfolio
 
Caprice 24-paganini violin solo
Caprice 24-paganini violin soloCaprice 24-paganini violin solo
Caprice 24-paganini violin solo
 
Черенкование хвойников
Черенкование хвойниковЧеренкование хвойников
Черенкование хвойников
 
Fluent_Spring_2014-Hauver
Fluent_Spring_2014-HauverFluent_Spring_2014-Hauver
Fluent_Spring_2014-Hauver
 
Microfiltration - Cryptosporidium Control Application
Microfiltration - Cryptosporidium Control ApplicationMicrofiltration - Cryptosporidium Control Application
Microfiltration - Cryptosporidium Control Application
 
Business Professionals Week
Business Professionals WeekBusiness Professionals Week
Business Professionals Week
 
[제94차 오픈포럼 발제자료] 한국에 창조와 미래가 있는가?_순천대 생물학과 박기영 교수
[제94차 오픈포럼 발제자료] 한국에 창조와 미래가 있는가?_순천대 생물학과 박기영 교수[제94차 오픈포럼 발제자료] 한국에 창조와 미래가 있는가?_순천대 생물학과 박기영 교수
[제94차 오픈포럼 발제자료] 한국에 창조와 미래가 있는가?_순천대 생물학과 박기영 교수
 
Enterprise and Acumen:Real World Information Skills and Employability for Bus...
Enterprise and Acumen:Real World Information Skills and Employability for Bus...Enterprise and Acumen:Real World Information Skills and Employability for Bus...
Enterprise and Acumen:Real World Information Skills and Employability for Bus...
 
Instalación Knoppix
Instalación KnoppixInstalación Knoppix
Instalación Knoppix
 
Top 5 challenges in global healthcare it
Top 5 challenges in global healthcare itTop 5 challenges in global healthcare it
Top 5 challenges in global healthcare it
 
eTail Asia Perfecting the Fundamentals of Ecommerce 2014 Agenda
eTail Asia Perfecting the Fundamentals of Ecommerce 2014 AgendaeTail Asia Perfecting the Fundamentals of Ecommerce 2014 Agenda
eTail Asia Perfecting the Fundamentals of Ecommerce 2014 Agenda
 
GPSinsights poster
GPSinsights posterGPSinsights poster
GPSinsights poster
 
Social Media and Email Stats from Six Countries
Social Media and Email Stats from Six CountriesSocial Media and Email Stats from Six Countries
Social Media and Email Stats from Six Countries
 
SXSW 2016 Recap: Highlights of Brands and Technologies
SXSW 2016 Recap: Highlights of Brands and TechnologiesSXSW 2016 Recap: Highlights of Brands and Technologies
SXSW 2016 Recap: Highlights of Brands and Technologies
 

Similar to Core Animation

iphonedevcon 2010: Cooking with iAd
iphonedevcon 2010:  Cooking with iAd iphonedevcon 2010:  Cooking with iAd
iphonedevcon 2010: Cooking with iAd
Lecturer UC Davis & Northwestern
 
303 TANSTAAFL: Using Open Source iPhone UI Code
303 TANSTAAFL: Using Open Source iPhone UI Code303 TANSTAAFL: Using Open Source iPhone UI Code
303 TANSTAAFL: Using Open Source iPhone UI Code
jonmarimba
 
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефонаКурсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефонаГлеб Тарасов
 
Building a Native Camera Access Library - Part V.pdf
Building a Native Camera Access Library - Part V.pdfBuilding a Native Camera Access Library - Part V.pdf
Building a Native Camera Access Library - Part V.pdf
ShaiAlmog1
 
iPhoneOS3.1でのカメラAPIについて
iPhoneOS3.1でのカメラAPIについてiPhoneOS3.1でのカメラAPIについて
iPhoneOS3.1でのカメラAPIについてKyosuke Takayama
 
Core animation taobao
Core animation taobaoCore animation taobao
Core animation taobaoyarshure Kong
 
Kick start with j query
Kick start with j queryKick start with j query
Kick start with j queryMd. Ziaul Haq
 
Dependency Injection @ AngularJS
Dependency Injection @ AngularJSDependency Injection @ AngularJS
Dependency Injection @ AngularJS
Ran Mizrahi
 
Yahoo Open Source - The Tour & Mystery of AppDevKit (MOPCON 2016)
Yahoo Open Source - The Tour & Mystery of AppDevKit (MOPCON 2016)Yahoo Open Source - The Tour & Mystery of AppDevKit (MOPCON 2016)
Yahoo Open Source - The Tour & Mystery of AppDevKit (MOPCON 2016)
anistar sung
 
iOSインタラクションデザイン
iOSインタラクションデザインiOSインタラクションデザイン
iOSインタラクションデザイン
hIDDENxv
 
Animations & swift
Animations & swiftAnimations & swift
Animations & swift
Arun Nagarajan
 
Randomising css animations
Randomising css animationsRandomising css animations
Randomising css animations
asjb
 
Creating an Uber Clone - Part XXII.pdf
Creating an Uber Clone - Part XXII.pdfCreating an Uber Clone - Part XXII.pdf
Creating an Uber Clone - Part XXII.pdf
ShaiAlmog1
 
Creating an Uber Clone - Part XXIV.pdf
Creating an Uber Clone - Part XXIV.pdfCreating an Uber Clone - Part XXIV.pdf
Creating an Uber Clone - Part XXIV.pdf
ShaiAlmog1
 
Introduction.to.j query
Introduction.to.j queryIntroduction.to.j query
Introduction.to.j queryHunter Wu
 
Swipe 2011 - iOS Gems
Swipe 2011 - iOS GemsSwipe 2011 - iOS Gems
Swipe 2011 - iOS Gems
Kevin O'Neill
 
Creating a Facebook Clone - Part XXXVI - Transcript.pdf
Creating a Facebook Clone - Part XXXVI - Transcript.pdfCreating a Facebook Clone - Part XXXVI - Transcript.pdf
Creating a Facebook Clone - Part XXXVI - Transcript.pdf
ShaiAlmog1
 

Similar to Core Animation (20)

iphonedevcon 2010: Cooking with iAd
iphonedevcon 2010:  Cooking with iAd iphonedevcon 2010:  Cooking with iAd
iphonedevcon 2010: Cooking with iAd
 
303 TANSTAAFL: Using Open Source iPhone UI Code
303 TANSTAAFL: Using Open Source iPhone UI Code303 TANSTAAFL: Using Open Source iPhone UI Code
303 TANSTAAFL: Using Open Source iPhone UI Code
 
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефонаКурсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
 
Building a Native Camera Access Library - Part V.pdf
Building a Native Camera Access Library - Part V.pdfBuilding a Native Camera Access Library - Part V.pdf
Building a Native Camera Access Library - Part V.pdf
 
iPhoneOS3.1でのカメラAPIについて
iPhoneOS3.1でのカメラAPIについてiPhoneOS3.1でのカメラAPIについて
iPhoneOS3.1でのカメラAPIについて
 
Core animation taobao
Core animation taobaoCore animation taobao
Core animation taobao
 
Kick start with j query
Kick start with j queryKick start with j query
Kick start with j query
 
Dependency Injection @ AngularJS
Dependency Injection @ AngularJSDependency Injection @ AngularJS
Dependency Injection @ AngularJS
 
Yahoo Open Source - The Tour & Mystery of AppDevKit (MOPCON 2016)
Yahoo Open Source - The Tour & Mystery of AppDevKit (MOPCON 2016)Yahoo Open Source - The Tour & Mystery of AppDevKit (MOPCON 2016)
Yahoo Open Source - The Tour & Mystery of AppDevKit (MOPCON 2016)
 
iOSインタラクションデザイン
iOSインタラクションデザインiOSインタラクションデザイン
iOSインタラクションデザイン
 
Animations & swift
Animations & swiftAnimations & swift
Animations & swift
 
Randomising css animations
Randomising css animationsRandomising css animations
Randomising css animations
 
004
004004
004
 
Creating an Uber Clone - Part XXII.pdf
Creating an Uber Clone - Part XXII.pdfCreating an Uber Clone - Part XXII.pdf
Creating an Uber Clone - Part XXII.pdf
 
Core animation
Core animationCore animation
Core animation
 
Creating an Uber Clone - Part XXIV.pdf
Creating an Uber Clone - Part XXIV.pdfCreating an Uber Clone - Part XXIV.pdf
Creating an Uber Clone - Part XXIV.pdf
 
Introduction.to.j query
Introduction.to.j queryIntroduction.to.j query
Introduction.to.j query
 
I os 04
I os 04I os 04
I os 04
 
Swipe 2011 - iOS Gems
Swipe 2011 - iOS GemsSwipe 2011 - iOS Gems
Swipe 2011 - iOS Gems
 
Creating a Facebook Clone - Part XXXVI - Transcript.pdf
Creating a Facebook Clone - Part XXXVI - Transcript.pdfCreating a Facebook Clone - Part XXXVI - Transcript.pdf
Creating a Facebook Clone - Part XXXVI - Transcript.pdf
 

Recently uploaded

Cracking the Workplace Discipline Code Main.pptx
Cracking the Workplace Discipline Code Main.pptxCracking the Workplace Discipline Code Main.pptx
Cracking the Workplace Discipline Code Main.pptx
Workforce Group
 
Evgen Osmak: Methods of key project parameters estimation: from the shaman-in...
Evgen Osmak: Methods of key project parameters estimation: from the shaman-in...Evgen Osmak: Methods of key project parameters estimation: from the shaman-in...
Evgen Osmak: Methods of key project parameters estimation: from the shaman-in...
Lviv Startup Club
 
FINAL PRESENTATION.pptx12143241324134134
FINAL PRESENTATION.pptx12143241324134134FINAL PRESENTATION.pptx12143241324134134
FINAL PRESENTATION.pptx12143241324134134
LR1709MUSIC
 
Meas_Dylan_DMBS_PB1_2024-05XX_Revised.pdf
Meas_Dylan_DMBS_PB1_2024-05XX_Revised.pdfMeas_Dylan_DMBS_PB1_2024-05XX_Revised.pdf
Meas_Dylan_DMBS_PB1_2024-05XX_Revised.pdf
dylandmeas
 
Organizational Change Leadership Agile Tour Geneve 2024
Organizational Change Leadership Agile Tour Geneve 2024Organizational Change Leadership Agile Tour Geneve 2024
Organizational Change Leadership Agile Tour Geneve 2024
Kirill Klimov
 
Agency Managed Advisory Board As a Solution To Career Path Defining Business ...
Agency Managed Advisory Board As a Solution To Career Path Defining Business ...Agency Managed Advisory Board As a Solution To Career Path Defining Business ...
Agency Managed Advisory Board As a Solution To Career Path Defining Business ...
Boris Ziegler
 
Set off and carry forward of losses and assessment of individuals.pptx
Set off and carry forward of losses and assessment of individuals.pptxSet off and carry forward of losses and assessment of individuals.pptx
Set off and carry forward of losses and assessment of individuals.pptx
HARSHITHV26
 
Exploring Patterns of Connection with Social Dreaming
Exploring Patterns of Connection with Social DreamingExploring Patterns of Connection with Social Dreaming
Exploring Patterns of Connection with Social Dreaming
Nicola Wreford-Howard
 
Search Disrupted Google’s Leaked Documents Rock the SEO World.pdf
Search Disrupted Google’s Leaked Documents Rock the SEO World.pdfSearch Disrupted Google’s Leaked Documents Rock the SEO World.pdf
Search Disrupted Google’s Leaked Documents Rock the SEO World.pdf
Arihant Webtech Pvt. Ltd
 
Company Valuation webinar series - Tuesday, 4 June 2024
Company Valuation webinar series - Tuesday, 4 June 2024Company Valuation webinar series - Tuesday, 4 June 2024
Company Valuation webinar series - Tuesday, 4 June 2024
FelixPerez547899
 
Discover the innovative and creative projects that highlight my journey throu...
Discover the innovative and creative projects that highlight my journey throu...Discover the innovative and creative projects that highlight my journey throu...
Discover the innovative and creative projects that highlight my journey throu...
dylandmeas
 
Cree_Rey_BrandIdentityKit.PDF_PersonalBd
Cree_Rey_BrandIdentityKit.PDF_PersonalBdCree_Rey_BrandIdentityKit.PDF_PersonalBd
Cree_Rey_BrandIdentityKit.PDF_PersonalBd
creerey
 
Brand Analysis for an artist named Struan
Brand Analysis for an artist named StruanBrand Analysis for an artist named Struan
Brand Analysis for an artist named Struan
sarahvanessa51503
 
Authentically Social Presented by Corey Perlman
Authentically Social Presented by Corey PerlmanAuthentically Social Presented by Corey Perlman
Authentically Social Presented by Corey Perlman
Corey Perlman, Social Media Speaker and Consultant
 
Business Valuation Principles for Entrepreneurs
Business Valuation Principles for EntrepreneursBusiness Valuation Principles for Entrepreneurs
Business Valuation Principles for Entrepreneurs
Ben Wann
 
Building Your Employer Brand with Social Media
Building Your Employer Brand with Social MediaBuilding Your Employer Brand with Social Media
Building Your Employer Brand with Social Media
LuanWise
 
LA HUG - Video Testimonials with Chynna Morgan - June 2024
LA HUG - Video Testimonials with Chynna Morgan - June 2024LA HUG - Video Testimonials with Chynna Morgan - June 2024
LA HUG - Video Testimonials with Chynna Morgan - June 2024
Lital Barkan
 
Kseniya Leshchenko: Shared development support service model as the way to ma...
Kseniya Leshchenko: Shared development support service model as the way to ma...Kseniya Leshchenko: Shared development support service model as the way to ma...
Kseniya Leshchenko: Shared development support service model as the way to ma...
Lviv Startup Club
 
ikea_woodgreen_petscharity_cat-alogue_digital.pdf
ikea_woodgreen_petscharity_cat-alogue_digital.pdfikea_woodgreen_petscharity_cat-alogue_digital.pdf
ikea_woodgreen_petscharity_cat-alogue_digital.pdf
agatadrynko
 
BeMetals Investor Presentation_June 1, 2024.pdf
BeMetals Investor Presentation_June 1, 2024.pdfBeMetals Investor Presentation_June 1, 2024.pdf
BeMetals Investor Presentation_June 1, 2024.pdf
DerekIwanaka1
 

Recently uploaded (20)

Cracking the Workplace Discipline Code Main.pptx
Cracking the Workplace Discipline Code Main.pptxCracking the Workplace Discipline Code Main.pptx
Cracking the Workplace Discipline Code Main.pptx
 
Evgen Osmak: Methods of key project parameters estimation: from the shaman-in...
Evgen Osmak: Methods of key project parameters estimation: from the shaman-in...Evgen Osmak: Methods of key project parameters estimation: from the shaman-in...
Evgen Osmak: Methods of key project parameters estimation: from the shaman-in...
 
FINAL PRESENTATION.pptx12143241324134134
FINAL PRESENTATION.pptx12143241324134134FINAL PRESENTATION.pptx12143241324134134
FINAL PRESENTATION.pptx12143241324134134
 
Meas_Dylan_DMBS_PB1_2024-05XX_Revised.pdf
Meas_Dylan_DMBS_PB1_2024-05XX_Revised.pdfMeas_Dylan_DMBS_PB1_2024-05XX_Revised.pdf
Meas_Dylan_DMBS_PB1_2024-05XX_Revised.pdf
 
Organizational Change Leadership Agile Tour Geneve 2024
Organizational Change Leadership Agile Tour Geneve 2024Organizational Change Leadership Agile Tour Geneve 2024
Organizational Change Leadership Agile Tour Geneve 2024
 
Agency Managed Advisory Board As a Solution To Career Path Defining Business ...
Agency Managed Advisory Board As a Solution To Career Path Defining Business ...Agency Managed Advisory Board As a Solution To Career Path Defining Business ...
Agency Managed Advisory Board As a Solution To Career Path Defining Business ...
 
Set off and carry forward of losses and assessment of individuals.pptx
Set off and carry forward of losses and assessment of individuals.pptxSet off and carry forward of losses and assessment of individuals.pptx
Set off and carry forward of losses and assessment of individuals.pptx
 
Exploring Patterns of Connection with Social Dreaming
Exploring Patterns of Connection with Social DreamingExploring Patterns of Connection with Social Dreaming
Exploring Patterns of Connection with Social Dreaming
 
Search Disrupted Google’s Leaked Documents Rock the SEO World.pdf
Search Disrupted Google’s Leaked Documents Rock the SEO World.pdfSearch Disrupted Google’s Leaked Documents Rock the SEO World.pdf
Search Disrupted Google’s Leaked Documents Rock the SEO World.pdf
 
Company Valuation webinar series - Tuesday, 4 June 2024
Company Valuation webinar series - Tuesday, 4 June 2024Company Valuation webinar series - Tuesday, 4 June 2024
Company Valuation webinar series - Tuesday, 4 June 2024
 
Discover the innovative and creative projects that highlight my journey throu...
Discover the innovative and creative projects that highlight my journey throu...Discover the innovative and creative projects that highlight my journey throu...
Discover the innovative and creative projects that highlight my journey throu...
 
Cree_Rey_BrandIdentityKit.PDF_PersonalBd
Cree_Rey_BrandIdentityKit.PDF_PersonalBdCree_Rey_BrandIdentityKit.PDF_PersonalBd
Cree_Rey_BrandIdentityKit.PDF_PersonalBd
 
Brand Analysis for an artist named Struan
Brand Analysis for an artist named StruanBrand Analysis for an artist named Struan
Brand Analysis for an artist named Struan
 
Authentically Social Presented by Corey Perlman
Authentically Social Presented by Corey PerlmanAuthentically Social Presented by Corey Perlman
Authentically Social Presented by Corey Perlman
 
Business Valuation Principles for Entrepreneurs
Business Valuation Principles for EntrepreneursBusiness Valuation Principles for Entrepreneurs
Business Valuation Principles for Entrepreneurs
 
Building Your Employer Brand with Social Media
Building Your Employer Brand with Social MediaBuilding Your Employer Brand with Social Media
Building Your Employer Brand with Social Media
 
LA HUG - Video Testimonials with Chynna Morgan - June 2024
LA HUG - Video Testimonials with Chynna Morgan - June 2024LA HUG - Video Testimonials with Chynna Morgan - June 2024
LA HUG - Video Testimonials with Chynna Morgan - June 2024
 
Kseniya Leshchenko: Shared development support service model as the way to ma...
Kseniya Leshchenko: Shared development support service model as the way to ma...Kseniya Leshchenko: Shared development support service model as the way to ma...
Kseniya Leshchenko: Shared development support service model as the way to ma...
 
ikea_woodgreen_petscharity_cat-alogue_digital.pdf
ikea_woodgreen_petscharity_cat-alogue_digital.pdfikea_woodgreen_petscharity_cat-alogue_digital.pdf
ikea_woodgreen_petscharity_cat-alogue_digital.pdf
 
BeMetals Investor Presentation_June 1, 2024.pdf
BeMetals Investor Presentation_June 1, 2024.pdfBeMetals Investor Presentation_June 1, 2024.pdf
BeMetals Investor Presentation_June 1, 2024.pdf
 

Core Animation

  • 1. CORE ANIMATION Animated UIs on the iPhone Monday, October 12, 2009
  • 2. WHY ANIMATE? Animation brings ‘real world’ feel to user interfaces Provides clues to what is happening in the UI Makes the UI feel more responsive Monday, October 12, 2009
  • 3. PLEAS DON’T Make your UI Animated just for the sake of animation Monday, October 12, 2009
  • 4. WHAT IS IT ANYWAY? Compositing Monday, October 12, 2009
  • 5. WHAT IS IT ANYWAY? Animation Monday, October 12, 2009
  • 6. WHAT IS IT ANYWAY? Animation Monday, October 12, 2009
  • 7. WHAT IS IT ANYWAY? Backend for all animation on the iPhone and Mac Monday, October 12, 2009
  • 8. BACKEND Simple Stuff is very Simple Monday, October 12, 2009
  • 9. BACKEND Complex Stuff is Possible image from @pagedooley Monday, October 12, 2009
  • 10. SIMPLE STUFF FIRST - (void)touchesEnded:(NSSet *)touches Begin Animations withEvent:(UIEvent *)event { [UIView beginAnimations:@"imageMove" context:NULL]; CGPoint location = [[touches anyObject] locationInView:self.view]; self.imageView.center = location; [UIView commitAnimations]; } Monday, October 12, 2009
  • 11. SIMPLE STUFF FIRST - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [UIView beginAnimations:@"imageMove" context:NULL]; CGPoint location = [[touches anyObject] locationInView:self.view]; self.imageView.center = location; [UIView commitAnimations]; Calculate and set } the new location Monday, October 12, 2009
  • 12. SIMPLE STUFF FIRST - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [UIView beginAnimations:@"imageMove" context:NULL]; CGPoint location = [[touches anyObject] locationInView:self.view]; self.imageView.center = location; [UIView commitAnimations]; } Start the animations Monday, October 12, 2009
  • 13. REAL WORLD USAGE Animate the Search bar into view Monday, October 12, 2009
  • 14. ANIMATE IN - (IBAction)search { if(nil == self.searchBar.superview) { self.searchBar.frame = CGRectMake(0.0f, -64.0f, 320.0f, 44.0f); [self.view addSubview:self.searchBar]; } [UIView beginAnimations:@"SearchBarMoveIn" context:NULL]; [UIView setAnimationDuration:0.5f]; CGRect frame = self.searchBar.frame; frame.origin.y = 0.0f; self.searchBar.frame = frame; [self.searchBar becomeFirstResponder]; [UIView commitAnimations]; } Monday, October 12, 2009
  • 15. ANIMATE IN - (IBAction)search { if(nil == self.searchBar.superview) { self.searchBar.frame = CGRectMake(0.0f, -64.0f, 320.0f, 44.0f); [self.view addSubview:self.searchBar]; } [UIView beginAnimations:@"SearchBarMoveIn" context:NULL]; [UIView setAnimationDuration:0.5f]; CGRect frame = self.searchBar.frame; frame.origin.y = 0.0f; self.searchBar.frame = frame; [self.searchBar becomeFirstResponder]; [UIView commitAnimations]; } Monday, October 12, 2009
  • 16. ANIMATE IN - (IBAction)search { if(nil == self.searchBar.superview) { self.searchBar.frame = CGRectMake(0.0f, -64.0f, 320.0f, 44.0f); [self.view addSubview:self.searchBar]; } [UIView beginAnimations:@"SearchBarMoveIn" context:NULL]; [UIView setAnimationDuration:0.5f]; CGRect frame = self.searchBar.frame; frame.origin.y = 0.0f; self.searchBar.frame = frame; [self.searchBar becomeFirstResponder]; [UIView commitAnimations]; } Monday, October 12, 2009
  • 17. ANIMATE IN - (IBAction)search { if(nil == self.searchBar.superview) { self.searchBar.frame = CGRectMake(0.0f, -64.0f, 320.0f, 44.0f); [self.view addSubview:self.searchBar]; } [UIView beginAnimations:@"SearchBarMoveIn" context:NULL]; [UIView setAnimationDuration:0.5f]; CGRect frame = self.searchBar.frame; frame.origin.y = 0.0f; self.searchBar.frame = frame; [self.searchBar becomeFirstResponder]; [UIView commitAnimations]; } Monday, October 12, 2009
  • 18. ANIMATE IN - (IBAction)search { if(nil == self.searchBar.superview) { self.searchBar.frame = CGRectMake(0.0f, -64.0f, 320.0f, 44.0f); [self.view addSubview:self.searchBar]; } [UIView beginAnimations:@"SearchBarMoveIn" context:NULL]; [UIView setAnimationDuration:0.5f]; CGRect frame = self.searchBar.frame; frame.origin.y = 0.0f; self.searchBar.frame = frame; [self.searchBar becomeFirstResponder]; [UIView commitAnimations]; } Monday, October 12, 2009
  • 19. ANIMATE IN - (IBAction)search { if(nil == self.searchBar.superview) { self.searchBar.frame = CGRectMake(0.0f, -64.0f, 320.0f, 44.0f); [self.view addSubview:self.searchBar]; } [UIView beginAnimations:@"SearchBarMoveIn" context:NULL]; [UIView setAnimationDuration:0.5f]; CGRect frame = self.searchBar.frame; frame.origin.y = 0.0f; self.searchBar.frame = frame; [self.searchBar becomeFirstResponder]; [UIView commitAnimations]; } Monday, October 12, 2009
  • 20. ANIMATE OUT - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { [self.searchBar resignFirstResponder]; [UIView beginAnimations:@"SearchBarMoveOut" context:nil]; [UIView setAnimationDuration:0.5f]; CGRect frame = self.searchBar.frame; frame.origin.y = -CGRectGetHeight(frame); self.searchBar.frame = frame; [UIView commitAnimations]; } Monday, October 12, 2009
  • 21. ANIMATE OUT - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { [self.searchBar resignFirstResponder]; [UIView beginAnimations:@"SearchBarMoveOut" context:nil]; [UIView setAnimationDuration:0.5f]; CGRect frame = self.searchBar.frame; frame.origin.y = -CGRectGetHeight(frame); self.searchBar.frame = frame; [UIView commitAnimations]; } Monday, October 12, 2009
  • 22. ANIMATE OUT - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { [self.searchBar resignFirstResponder]; [UIView beginAnimations:@"SearchBarMoveOut" context:nil]; [UIView setAnimationDuration:0.5f]; CGRect frame = self.searchBar.frame; frame.origin.y = -CGRectGetHeight(frame); self.searchBar.frame = frame; [UIView commitAnimations]; } Monday, October 12, 2009
  • 23. ANIMATE OUT - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { [self.searchBar resignFirstResponder]; [UIView beginAnimations:@"SearchBarMoveOut" context:nil]; [UIView setAnimationDuration:0.5f]; CGRect frame = self.searchBar.frame; frame.origin.y = -CGRectGetHeight(frame); self.searchBar.frame = frame; [UIView commitAnimations]; } Monday, October 12, 2009
  • 24. DRAWING ATTENTION Making elements jump out Monday, October 12, 2009
  • 25. SEARCHING - (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar { [self.gridView animateImagesRelatedTo:searchBar.text]; } Monday, October 12, 2009
  • 26. ANIMATING IMAGES - (void)animateImagesRelatedTo:(NSString *)term { NSUInteger count = random() % self.gridLayer.images.count; if(count < 1) { count = 1; } for(NSUInteger i = 0;i < count;i++) { NSUInteger index = random() % self.gridLayer.sublayers.count; CALayer *layer = [[self.gridLayer sublayers] objectAtIndex:index]; [layer addAnimation:[self foundAnimation] forKey:@"emphasise"]; } } Monday, October 12, 2009
  • 27. FOUND ANIMATION - (CAAnimationGroup *)foundAnimation { CAAnimationGroup *foundAnimation = [CAAnimationGroup animation]; CATransform3D zoomTransform = CATransform3DMakeScale(0.75f, 0.75f, 1.0f); CABasicAnimation *zoomOutAnimation = [self zoomOutAnimation:zoomTransform]; CAKeyframeAnimation *flipAnimation = [self flipAnimation:zoomTransform]; CABasicAnimation *zoomInAnimation = [self zoomInAnimation:zoomTransform]; foundAnimation.animations = [NSArray arrayWithObjects:zoomOutAnimation, flipAnimation, zoomInAnimation, nil]; foundAnimation.duration = 2.0f; return foundAnimation; } Monday, October 12, 2009
  • 28. FOUND ANIMATION - (CAAnimationGroup *)foundAnimation { CAAnimationGroup *foundAnimation = [CAAnimationGroup animation]; CATransform3D zoomTransform = CATransform3DMakeScale(0.75f, 0.75f, 1.0f); CABasicAnimation *zoomOutAnimation = [self zoomOutAnimation:zoomTransform]; CAKeyframeAnimation *flipAnimation = [self flipAnimation:zoomTransform]; CABasicAnimation *zoomInAnimation = [self zoomInAnimation:zoomTransform]; foundAnimation.animations = [NSArray arrayWithObjects:zoomOutAnimation, flipAnimation, zoomInAnimation, nil]; foundAnimation.duration = 2.0f; return foundAnimation; } Monday, October 12, 2009
  • 29. FOUND ANIMATION - (CAAnimationGroup *)foundAnimation { CAAnimationGroup *foundAnimation = [CAAnimationGroup animation]; CATransform3D zoomTransform = CATransform3DMakeScale(0.75f, 0.75f, 1.0f); CABasicAnimation *zoomOutAnimation = [self zoomOutAnimation:zoomTransform]; CAKeyframeAnimation *flipAnimation = [self flipAnimation:zoomTransform]; CABasicAnimation *zoomInAnimation = [self zoomInAnimation:zoomTransform]; foundAnimation.animations = [NSArray arrayWithObjects:zoomOutAnimation, flipAnimation, zoomInAnimation, nil]; foundAnimation.duration = 2.0f; return foundAnimation; } Monday, October 12, 2009
  • 30. FOUND ANIMATION - (CAAnimationGroup *)foundAnimation { CAAnimationGroup *foundAnimation = [CAAnimationGroup animation]; CATransform3D zoomTransform = CATransform3DMakeScale(0.75f, 0.75f, 1.0f); CABasicAnimation *zoomOutAnimation = [self zoomOutAnimation:zoomTransform]; CAKeyframeAnimation *flipAnimation = [self flipAnimation:zoomTransform]; CABasicAnimation *zoomInAnimation = [self zoomInAnimation:zoomTransform]; foundAnimation.animations = [NSArray arrayWithObjects:zoomOutAnimation, flipAnimation, zoomInAnimation, nil]; foundAnimation.duration = 2.0f; return foundAnimation; } Monday, October 12, 2009
  • 31. 3 PART ANIMATION Monday, October 12, 2009
  • 32. 3 PART ANIMATION Monday, October 12, 2009
  • 33. ZOOM OUT ANIMATION - (CABasicAnimation *)zoomOutAnimation:(CATransform3D)zoomTransform { CABasicAnimation *zoomOutAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; zoomOutAnimation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; zoomOutAnimation.toValue = [NSValue valueWithCATransform3D:zoomTransform]; zoomOutAnimation.duration = 0.5f; return zoomOutAnimation; } Monday, October 12, 2009
  • 34. ZOOM OUT ANIMATION - (CABasicAnimation *)zoomOutAnimation:(CATransform3D)zoomTransform { CABasicAnimation *zoomOutAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; zoomOutAnimation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; zoomOutAnimation.toValue = [NSValue valueWithCATransform3D:zoomTransform]; zoomOutAnimation.duration = 0.5f; return zoomOutAnimation; } Monday, October 12, 2009
  • 35. ZOOM OUT ANIMATION - (CABasicAnimation *)zoomOutAnimation:(CATransform3D)zoomTransform { CABasicAnimation *zoomOutAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; zoomOutAnimation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; zoomOutAnimation.toValue = [NSValue valueWithCATransform3D:zoomTransform]; zoomOutAnimation.duration = 0.5f; return zoomOutAnimation; } Monday, October 12, 2009
  • 36. FLIP ANIMATION - (CAKeyframeAnimation *)flipAnimation:(CATransform3D) zoomTransform { CAKeyframeAnimation *flipAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform"]; flipAnimation.beginTime = 0.5f; CGFloat rotationVector[3] = {1.0f, 1.0f, 0.0f}; CATransform3D flipTransform1 = CATransform3DRotate(zoomTransform, 1.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); CATransform3D flipTransform2 = CATransform3DRotate(zoomTransform, 2.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); CATransform3D flipTransform3 = CATransform3DRotate(zoomTransform, 3.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); CATransform3D flipTransform4 = CATransform3DRotate(zoomTransform, 4.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); flipAnimation.values = [NSArray arrayWithObjects: [NSValue valueWithCATransform3D:zoomTransform], [NSValue valueWithCATransform3D:flipTransform1], [NSValue valueWithCATransform3D:flipTransform2], [NSValue valueWithCATransform3D:flipTransform3], [NSValue valueWithCATransform3D:flipTransform4], [NSValue valueWithCATransform3D:zoomTransform], nil]; flipAnimation.duration = 1.0f; return flipAnimation; } Monday, October 12, 2009
  • 37. FLIP ANIMATION - (CAKeyframeAnimation *)flipAnimation:(CATransform3D) zoomTransform { CAKeyframeAnimation *flipAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform"]; flipAnimation.beginTime = 0.5f; CGFloat rotationVector[3] = {1.0f, 1.0f, 0.0f}; CATransform3D flipTransform1 = CATransform3DRotate(zoomTransform, 1.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); CATransform3D flipTransform2 = CATransform3DRotate(zoomTransform, 2.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); CATransform3D flipTransform3 = CATransform3DRotate(zoomTransform, 3.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); CATransform3D flipTransform4 = CATransform3DRotate(zoomTransform, 4.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); flipAnimation.values = [NSArray arrayWithObjects: [NSValue valueWithCATransform3D:zoomTransform], [NSValue valueWithCATransform3D:flipTransform1], [NSValue valueWithCATransform3D:flipTransform2], [NSValue valueWithCATransform3D:flipTransform3], [NSValue valueWithCATransform3D:flipTransform4], [NSValue valueWithCATransform3D:zoomTransform], nil]; flipAnimation.duration = 1.0f; return flipAnimation; } Monday, October 12, 2009
  • 38. FLIP ANIMATION - (CAKeyframeAnimation *)flipAnimation:(CATransform3D) zoomTransform { CAKeyframeAnimation *flipAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform"]; flipAnimation.beginTime = 0.5f; CGFloat rotationVector[3] = {1.0f, 1.0f, 0.0f}; CATransform3D flipTransform1 = CATransform3DRotate(zoomTransform, 1.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); CATransform3D flipTransform2 = CATransform3DRotate(zoomTransform, 2.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); CATransform3D flipTransform3 = CATransform3DRotate(zoomTransform, 3.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); CATransform3D flipTransform4 = CATransform3DRotate(zoomTransform, 4.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); flipAnimation.values = [NSArray arrayWithObjects: [NSValue valueWithCATransform3D:zoomTransform], [NSValue valueWithCATransform3D:flipTransform1], [NSValue valueWithCATransform3D:flipTransform2], [NSValue valueWithCATransform3D:flipTransform3], [NSValue valueWithCATransform3D:flipTransform4], [NSValue valueWithCATransform3D:zoomTransform], nil]; flipAnimation.duration = 1.0f; return flipAnimation; } Monday, October 12, 2009
  • 39. FLIP ANIMATION - (CAKeyframeAnimation *)flipAnimation:(CATransform3D) zoomTransform { CAKeyframeAnimation *flipAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform"]; flipAnimation.beginTime = 0.5f; CGFloat rotationVector[3] = {1.0f, 1.0f, 0.0f}; CATransform3D flipTransform1 = CATransform3DRotate(zoomTransform, 1.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); CATransform3D flipTransform2 = CATransform3DRotate(zoomTransform, 2.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); CATransform3D flipTransform3 = CATransform3DRotate(zoomTransform, 3.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); CATransform3D flipTransform4 = CATransform3DRotate(zoomTransform, 4.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); flipAnimation.values = [NSArray arrayWithObjects: [NSValue valueWithCATransform3D:zoomTransform], [NSValue valueWithCATransform3D:flipTransform1], [NSValue valueWithCATransform3D:flipTransform2], [NSValue valueWithCATransform3D:flipTransform3], [NSValue valueWithCATransform3D:flipTransform4], [NSValue valueWithCATransform3D:zoomTransform], nil]; flipAnimation.duration = 1.0f; return flipAnimation; } Monday, October 12, 2009
  • 40. FLIP ANIMATION - (CAKeyframeAnimation *)flipAnimation:(CATransform3D) zoomTransform { CAKeyframeAnimation *flipAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform"]; flipAnimation.beginTime = 0.5f; CGFloat rotationVector[3] = {1.0f, 1.0f, 0.0f}; CATransform3D flipTransform1 = CATransform3DRotate(zoomTransform, 1.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); CATransform3D flipTransform2 = CATransform3DRotate(zoomTransform, 2.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); CATransform3D flipTransform3 = CATransform3DRotate(zoomTransform, 3.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); CATransform3D flipTransform4 = CATransform3DRotate(zoomTransform, 4.0f * M_PI / 2.0f, rotationVector[0], rotationVector[1], rotationVector[2]); flipAnimation.values = [NSArray arrayWithObjects: [NSValue valueWithCATransform3D:zoomTransform], [NSValue valueWithCATransform3D:flipTransform1], [NSValue valueWithCATransform3D:flipTransform2], [NSValue valueWithCATransform3D:flipTransform3], [NSValue valueWithCATransform3D:flipTransform4], [NSValue valueWithCATransform3D:zoomTransform], nil]; flipAnimation.duration = 1.0f; return flipAnimation; } Monday, October 12, 2009
  • 41. ZOOM IN ANIMATION - (CABasicAnimation *)zoomInAnimation:(CATransform3D)zoomTransform { CABasicAnimation *zoomInAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; zoomInAnimation.beginTime = 1.5f; zoomInAnimation.fromValue = [NSValue valueWithCATransform3D:zoomTransform]; zoomInAnimation.toValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; zoomInAnimation.duration = 0.5f; return zoomInAnimation; } Monday, October 12, 2009
  • 42. RUN THE CODE Monday, October 12, 2009
  • 43. THANKS Pragmatic iPhone Studio Monday, October 12, 2009