Search code examples
iosobjective-canimationcore-animation

the paper folding/unfolding effect in twitter for iPad


Twitter for iPad implements a fancy "pinch to expand paper fold" effect. A short video clip here. http://www.youtube.com/watch?v=B0TuPsNJ-XY

Can this be done with CATransform3D without OpenGL? A working example would be thankful.

Update: I was interested in the approach or implementation to this animation effect. That's why I offered bounty on this question - srikar


Solution

  • Here's a really simple example using a gesture recognizer and CATransform3D to get you started. Simply pinch to rotate the gray view.

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        // ...
    
        CGRect rect = self.window.bounds;
        view = [[UIView alloc] initWithFrame:CGRectMake(rect.size.width/4, rect.size.height/4,
                                                             rect.size.width/2, rect.size.height/2)];
        view.backgroundColor = [UIColor lightGrayColor];
        [self.window addSubview:view];
    
        CATransform3D transform = CATransform3DIdentity;
        transform.m34 = -1/500.0; // this allows perspective
        self.window.layer.sublayerTransform = transform;
    
        UIPinchGestureRecognizer *rec = [[UIPinchGestureRecognizer alloc] initWithTarget:self
                                                                                  action:@selector(pinch:)];
        [self.window addGestureRecognizer:rec];
        [rec release];
    
        return YES;
    }
    
    - (void)pinch:(UIPinchGestureRecognizer *)rec
    {
        CATransform3D t = CATransform3DIdentity;
        t = CATransform3DTranslate(t, 0, -self.view.bounds.size.height/2, 0);
        t = CATransform3DRotate(t, rec.scale * M_PI, 1, 0, 0);
        t = CATransform3DTranslate(t, 0, -self.view.bounds.size.height/2, 0);
        self.view.layer.transform = t;
    }