Custom transition between two UIViews

后端 未结 6 589
暗喜
暗喜 2020-12-17 01:55

I have two views \"A\" and \"B\". A floats in the middle of the window (it\'s not full screen). B, the view which will replace A, is full screen. I\'d like to write a custom

相关标签:
6条回答
  • 2020-12-17 02:34

    I'm assuming you just want to change the image view's image while you flip and scale it. Following code flips the image view using default animation, scales it to the other view's frame and sets the image:

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.imageViewA cache:NO];
    [UIView setAnimationDuration:2];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationFinished:)];
    self.imageViewA.frame = self.imageViewB.frame;
    self.imageViewA.image = self.imageViewB.image;
    [UIView commitAnimations];
    

    if you wish to show the A view as your tiny floating view again with some other image you can just set it's frame and image without the animation block in AnimationDidStopSelector method which you can set

    -(void)animationFinished:(id)context
    {
        self.imageViewA.frame = tinyRect;
        self.imageViewA.image = [UIImage imageNamed:@"a.jpg"];
    }
    

    where tinyRect is the floating A view's original frame.

    0 讨论(0)
  • 2020-12-17 02:38

    Checkout this svn repository:

    http://boondoggle.atomicwang.org/lemurflip/
    

    This does flip two views.

    0 讨论(0)
  • 2020-12-17 02:48

    This is an easy example that i made for you :-) Start with it... Try to understand it... Read Documentation and then you will be able to do what you want ;-)

    - (void)moveTable:(UITableView *)table toPoint:(CGPoint)point excursion:(CGFloat)excursion {
    
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:0.5];
    [table setCenter:point];
    
    // scaling
    CABasicAnimation *scalingAnimation = (CABasicAnimation *)[table.layer animationForKey:@"scaling"];
    if (!scalingAnimation)
    {
        scalingAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
        scalingAnimation.duration=0.5/2.0f;
        scalingAnimation.autoreverses=YES;
        scalingAnimation.removedOnCompletion = YES;
        scalingAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
        scalingAnimation.fromValue=[NSValue valueWithCATransform3D:CATransform3DMakeTranslation(0.0, 0.0, 0.0)];
        scalingAnimation.toValue=[NSValue valueWithCATransform3D:CATransform3DMakeTranslation(excursion, 0.0, 0.0)];
    }
    [table.layer addAnimation:scalingAnimation forKey:@"scaling"];
    [UIView commitAnimations];
    

    }

    0 讨论(0)
  • 2020-12-17 02:49

    It's a little rough around the edges, but here's what I did using block animations. The following flips the view, centers it and goes fullscreen:

    // the view on the other side of the card
    UIView* redView = [[UIView alloc]initWithFrame:CGRectMake(0.0, 0.0, viewToFlip.frame.size.width, viewToFlip.frame.size.height)];
    redView.backgroundColor = [UIColor redColor];
    
    // add a green square to the red view so we have something else to look at
    UIView* greenSquare = [[UIView alloc]initWithFrame:CGRectMake(10.0, 10.0, 20.0, 20.0)];
    greenSquare.backgroundColor = [UIColor greenColor];    
    [redView addSubview:greenSquare];
    
    // the flip animation
    [UIView animateWithDuration:0.25
                          delay:0.0
                        options:UIViewAnimationCurveLinear
                     animations:^{
    
                         // rotate 90 degrees
                         [viewToFlip.layer setTransform: CATransform3DRotate(viewToFlip.layer.transform, -M_PI/2, 0.0, 1.0, 0.0)];
    
                     } 
                     completion:^(BOOL finished){
    
                         // now that we're 90 degrees, swap one view for the other
                         // but if we add it now, the view will be backwards, so flip the original view back
                         [viewToFlip.layer setTransform: CATransform3DRotate(viewToFlip.layer.transform, M_PI, 0.0, 1.0, 0.0)];
                         [viewToFlip addSubview:redView];
    
                         // now let's continue our rotation
                         [UIView animateWithDuration:0.25
                                               delay:0.0
                                             options:UIViewAnimationCurveLinear
                                          animations:^{
    
                                              // rotate the last 90 degrees
                                              [viewToFlip.layer setTransform: CATransform3DRotate(viewToFlip.layer.transform, -M_PI/2, 0.0, 1.0, 0.0)];
    
                                          } 
                                          completion:^(BOOL finished){
    
                                              [UIView animateWithDuration:0.25
                                                                    delay:0.0
                                                                  options:UIViewAnimationCurveLinear
                                                               animations:^{
    
                                                                   // animate the views to the center of the screen and adjust their bounds to fill up the screen
                                                                   [viewToFlip setCenter:CGPointMake(self.view.center.x, self.view.center.y)];
                                                                   [viewToFlip setBounds:CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height)];
                                                                   [redView setCenter:CGPointMake(self.view.center.x, self.view.center.y)];
                                                                   [redView setBounds:CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height)];
                                                               }
                                                               completion:nil];
    
    
                                          }];
    
                     }];
    
    0 讨论(0)
  • 2020-12-17 02:51

    I've done this before. Here's the gist of how I did it:

    1. View A is on screen
    2. Create View B, give it a frame that makes it fullscreen, but don't add it to the screen yet
    3. View B has a UIImageView as it's topmost view
    4. Capture a UIImage of View A, and set it as the image of View B's image view

      UIGraphicsBeginImageContext(view.bounds.size); 
      [viewA.layer renderInContext:UIGraphicsGetCurrentContext()]; 
      UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
      viewB.imageView.image = image;
      
    5. Set View B's transform (scale and translation) so that it is shrunk to the size of View A and is positioned where View A is on the screen

    6. Add View B to the screen
    7. At this point, the user hasn't noticed anything change, because View B looks exactly like View A
    8. Now start an animation block, in which you
      • Set [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView:ViewB
      • set View B's transform to CGAffineTransformIdentity
      • remove View B's imageview from View B

    The result is an animation that looks like View A is flipping over and zooming to fill the screen with View B as the opposite side.

    0 讨论(0)
  • 2020-12-17 02:54

    Try something like this. As long as A's frame isn't fullscreen to start with then the animation should just flip A. When you add a subview to a view in a flip transition then it is added to the back of that view, so view A's frame is the one you want to modify.

    [UIView beginAnimations:@"flipopen" context:nil];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self cache:TRUE];
    [a addSubview:b];
    a.frame = b.frame;
    [UIView commitAnimations];
    
    0 讨论(0)
提交回复
热议问题