How to flip an individual UIView (without flipping the parent view)

前端 未结 6 495
一整个雨季
一整个雨季 2020-11-27 15:16

This is an iPad project where I have a UIView with several subViews, and I am trying to animate one of this UIViews using [UIView transitionFromView:toView:duration:options:

相关标签:
6条回答
  • 2020-11-27 15:29

    I fixed this problem by using old-school animations:

    [UIView beginAnimations:@"Flip" context:nil];
    [UIView setAnimationDuration:1];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:firstView cache:YES];
    
    [self addSubview:secondView];
    
    [UIView commitAnimations];
    

    Additionally you can remove the firstView:

    [firstView removeFromSuperview];
    
    0 讨论(0)
  • 2020-11-27 15:31

    I had problems getting this to work also. I used the code written by Floris, but although it worked for the first "flip" the next flip started to go weird where the buttons and labels on the frontside UI View lost there positions.

    I put the code below into place and it is working fine.

    Couple of things to note:

    1. panelView is a UIView control on the ViewController that has two other UIViews nested inside it (subviews). The first one is called frontView, second one is called backView. (see picture below)

    image of the view and subviews in IB

    1. I have a bool property called displayingFront on the class

    (in my .h)

    @property BOOL displayingFront;
    

    in my .m

    @synthesize displayingFront;
    

    in my viewDidLoad method

    self.displayingFront = YES;
    

    This is the code in the .m that i have rigged up to the two buttons if front and back UIViews...

    - (IBAction)flip:(id)sender
    {
        [UIView transitionWithView:self.panelView
                          duration:1.0
                           options:(displayingFront ? UIViewAnimationOptionTransitionFlipFromRight :
                                    UIViewAnimationOptionTransitionFlipFromLeft)
                        animations: ^{
                            if(displayingFront)
                            {
                                self.frontView.hidden = true;
                                self.backView.hidden = false;
                            }
                            else
                            {
                                self.frontView.hidden = false;
                                self.backView.hidden = true;
                            }
                        }
    
                        completion:^(BOOL finished) {
                            if (finished) {
                                displayingFront = !displayingFront;
                            }
                        }];
    }
    
    0 讨论(0)
  • 2020-11-27 15:38

    Use a container view to hold your subviews, and make the container view the same size as your subview that you're trying to animate.

    So, you can setup your views like this.

    self.view-> "a container view" -> subviews

    0 讨论(0)
  • 2020-11-27 15:39

    I'd like to make an update of Steve Parker's answer in SWIFT 4:-

    var displayBlankView:Bool = true
    
    UIView.transition(with:flipView, duration:1.0, options:displayBlankView ? .transitionFlipFromLeft:.transitionFlipFromRight, animations:{
            if(self.displayBlankView){
                self.view1.isHidden=true
                self.view2.isHidden=false
            }else{
                self.view1.isHidden=false
                self.view2.isHidden=true
            }
        }, completion:{
            (finished: Bool) in
            self.displayBlankView = !self.displayBlankView;
    
        })
    
    0 讨论(0)
  • 2020-11-27 15:43

    this code may helps you:

    put the two views you want to flip inside an unnamed view with the same size and link the IBOutlet UIView *newView,*oldView; to the views and put the new view on top

    bool a = NO;
    
    @implementation ViewController
    
    - (IBAction)flip:(id)sender 
    {
        if (a == NO) {
            [UIView transitionFromView:oldView toView:newView  
                      duration:1.0 
                      options:UIViewAnimationOptionTransitionFlipFromLeft 
                      completion:NULL];
            a = YES; // a = !a;
        }
        else {
            [UIView transitionFromView:newView toView:oldView  
                      duration:1.0 
                      options:UIViewAnimationOptionTransitionFlipFromLeft 
                      completion:NULL];
            a = NO; // a = !a;
        }
    }
    
    0 讨论(0)
  • 2020-11-27 15:45
    **//flipping view continuously**  
    
    
    
     bool a = NO;
    
    
    -(void)viewDidLoad
    {
    
    
    
    // THIS is the canvass holding the two views this view is flipping
     UIView *v=[[UIView alloc]initWithFrame:CGRectMake(40, 40, 150, 150)];
    
       v.backgroundColor=[UIColor clearColor];
    
        [self.view addSubview:v];
    
         [v addSubview:yourfirstview];
         [v addSubview:yoursecondview];
    
    // calling the method
    
    [NSTimer scheduledTimerWithTimeInterval:2.0
                                         target:self
                                       selector:@selector(flip)
                                       userInfo:nil
                                        repeats:YES];
    
    }
    
    
    
    //flipping view randomly
    
    -(void)flip 
    
    {
    
    if (a == NO) 
    {
    
    [UIView transitionFromView:yourfirstview toView:yoursecondview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL];
            a = YES;
        }
    
    else if(a==YES) 
    {
    
    [UIView transitionFromView:yoursecondview toView:yourfirstview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL];
         a = NO;
      }
    
    }
    
    0 讨论(0)
提交回复
热议问题