How can I flip and enlarge a UIView it at the same time like iOS 7 iPad App Store?

前端 未结 3 732
星月不相逢
星月不相逢 2021-01-06 06:49

The iPad iOS 7 App Store has a pretty cool animation for when you click on an app icon (from the featured list when the icon is smaller, not a search result). Here is a pict

3条回答
  •  孤街浪徒
    2021-01-06 07:36

    I took a video of the animation in the iPad App Store app, and it doesn't look like a UIView transition. If you play it back slowly, it looks like two animations are happening simultaneously: 1) the icon is rotating to about 90 degrees, scaling, and translating 2) the details are fading in, rotating a little bit, scaling, and translating to the final destination. So the details aren't continuing where the icon left off.

    I think that is why it looks weird when trying to do this using view animations.

    To accomplish a flip between views that is more continuous, see the code below. It basically does this in several steps: 1) Position backView to where frontView is 2) Animate the frontView rotating and scaling halfway 3) Set the backView transform to be the same as frontView 4) Show the backView 5) Animate backView rotating and scaling the rest of the way

    Flipping back is the basically reverse. Works great.

    // flip and scale frontView to reveal backView to the center of the screen
    // uses a containerView to mark the end of the animation
    // parameterizing the destination is an exercise for the reader
    - (void)flipFromFront:(UIView*)frontView toBack:(UIView*)backView
    {
        float duration = 0.5;
    
        // distance from center of screen from frontView
        float dx = self.view.center.x - frontView.center.x;
        float dy = self.view.center.y - frontView.center.y;
    
        // this prevents any tearing
        backView.layer.zPosition = 200.0;
    
        // hide the backView and position where frontView is
        backView.hidden = NO;
        backView.alpha = 0.0;
        backView.frame = frontView.frame;
    
        // start the animation
        [UIView animateKeyframesWithDuration:duration
                                       delay:0.25
                                     options:UIViewKeyframeAnimationOptionCalculationModeCubic
                                  animations:^{
                                      // part 1.  Rotate and scale frontView halfWay.
                                      [UIView addKeyframeWithRelativeStartTime:0.0
                                                              relativeDuration:0.5
                                                                    animations:^{
                                                                        // get the transform for the blue layer
                                                                        CATransform3D xform = frontView.layer.transform;
                                                                        // translate half way
                                                                        xform = CATransform3DTranslate(xform, dx/2, dy/2, 0);
                                                                        // rotate half way
                                                                        xform = CATransform3DRotate(xform, M_PI_2, 0, 1, 0);
                                                                        // scale half way
                                                                        xform = CATransform3DScale(xform, 1.5, 1.5, 1);
                                                                        // apply the transform
                                                                        frontView.layer.transform = xform;
                                                                    }];
    
                                      // part 2. set the backView transform to frontView so they are in the same
                                      // position.
                                      [UIView addKeyframeWithRelativeStartTime:0.5
                                                              relativeDuration:0.0
                                                                    animations:^{
                                                                        backView.layer.transform = frontView.layer.transform;
                                                                        backView.alpha = 1.0;
                                                                    }];
    
                                      // part 3.  rotate and scale backView into center of container
                                      [UIView addKeyframeWithRelativeStartTime:0.5
                                                              relativeDuration:0.5
                                                                    animations:^{
                                                                        // undo previous transforms with animation
                                                                        backView.layer.transform = CATransform3DIdentity;
                                                                        // animate backView into new location
                                                                        backView.frame = self.containerView.frame;
                                                                    }];
                                  } completion:^(BOOL finished) {
                                      self.displayingFront = !self.displayingFront;
                                  }];
    }
    
    // flip from back to front
    - (void) flipFromBack:(UIView*)backView toFront:(UIView*)frontView
    {
        float duration = 0.5;
    
        // get distance from center of screen to destination
        float dx = self.view.center.x - frontView.center.x;
        float dy = self.view.center.y - frontView.center.y;
    
        backView.layer.zPosition = 200.0;
        frontView.hidden = YES;
    
        // this is basically the reverse of the previous animation
        [UIView animateKeyframesWithDuration:duration
                                       delay:0
                                     options:UIViewKeyframeAnimationOptionCalculationModeCubic
                                  animations:^{
                                      [UIView addKeyframeWithRelativeStartTime:0.0
                                                              relativeDuration:0.5
                                                                    animations:^{
                                                                        CATransform3D xform = backView.layer.transform;
                                                                        xform = CATransform3DTranslate(xform, -dx/2, -dy/2, 0);
                                                                        xform = CATransform3DRotate(xform, M_PI_2, 0, 1, 0);
                                                                        xform = CATransform3DScale(xform, 0.75, 0.75, 1);
                                                                        backView.layer.transform = xform;
                                                                    }];
    
                                      [UIView addKeyframeWithRelativeStartTime:0.5
                                                              relativeDuration:0.0
                                                                    animations:^{
                                                                        backView.alpha = 0.0;
                                                                        frontView.hidden = NO;
                                                                    }];
    
                                      [UIView addKeyframeWithRelativeStartTime:0.5
                                                              relativeDuration:0.5
                                                                    animations:^{
                                                                        self.hiddenView.alpha = 0.0;
                                                                        frontView.layer.transform = CATransform3DIdentity;
                                                                    }];
                                  } completion:^(BOOL finished) {
                                      self.displayingFront = !self.displayingFront;
                                  }];
    }
    

提交回复
热议问题