Transition of view controllers - from left to right

前端 未结 2 741
情话喂你
情话喂你 2020-12-30 16:58

I am NOT using navigation controller, and I am using storyboards.

I have to make a transition from 1 view controller to other, for which I am using segue.

N

相关标签:
2条回答
  • 2020-12-30 17:13

    Usually you would give a storyboardId to the destinationController and call it like this from the sourceViewController:

    //push next view
    UIStoryboard *storyboard = self.storyboard;
    YourViewControllerClass *destVC = [storyboard instantiateViewControllerWithIdentifier:@"StoryboardID"];
    [self.navigationController pushViewController:destVC animated:YES];
    

    Optionally, you can do it manually like this:

        // Get the views.
        UIView * fromView = sourceViewController.view;
        UIView * toView = destinationViewController.view;
    
        // Get the size of the view area.
        CGRect viewSize = fromView.frame;
    
        // Add the toView to the fromView
        [fromView.superview addSubview:toView];
    
        // Position it off screen.
        toView.frame = CGRectMake( 320 , viewSize.origin.y, 320, viewSize.size.height);
    
        [UIView animateWithDuration:0.4 animations:
         ^{
             // Animate the views on and off the screen. This will appear to slide.
             fromView.frame =CGRectMake( -320 , viewSize.origin.y, 320, viewSize.size.height);
             toView.frame =CGRectMake(0, viewSize.origin.y, 320, viewSize.size.height);
         }
                         completion:^(BOOL finished)
         {
             if (finished)
             {
                 // Remove the old view from its parent.
                 [fromView removeFromSuperview];
    
                 //I use it to have navigationnBar and TabBar at the same time
                 //self.tabBarController.selectedIndex = indexPath.row+1;
             }
         }];
    

    ** EDIT **

    Inverse function (similar to the back button in the navigation controller):

    // Get the views.
    UIView * fromView = fromViewController.view;
    UIView * toView = destViewController.view;
    
    // Get the size of the view area.
    CGRect viewSize = fromView.frame;
    
    // Add the to view to the tab bar view.
    [fromView.superview addSubview:toView];
    
    // Position it off screen.
    toView.frame = CGRectMake( -320 , viewSize.origin.y, 320, viewSize.size.height);
    
    [UIView animateWithDuration:0.4 animations:
     ^{
         // Animate the views on and off the screen. This will appear to slide.
         fromView.frame =CGRectMake( 320 , viewSize.origin.y, 320, viewSize.size.height);
         toView.frame =CGRectMake(0, viewSize.origin.y, 320, viewSize.size.height);
     }
                     completion:^(BOOL finished)
     {
         if (finished)
         {
             // Remove the old view from the tabbar view.
             [fromView removeFromSuperview];
         }
     }];
    
    0 讨论(0)
  • 2020-12-30 17:27

    All of the ViewControllers in my app inherit from MyViewController which, in addition to some other default behaviours, has this property:

    @property(readwrite, nonatomic) BOOL slideFromSide;
    

    And this code:

    - (void) presentViewController: (UIViewController*) vc animated: (BOOL) flag completion: (void (^)(void)) completion
    {
        BOOL slideIn = NO;
        if ([vc isKindOfClass: [MyViewController class]])
        {
            MyViewController *svc = (MyViewController*) vc;
            slideIn = svc.slideFromSide;
        }
    
        if (slideIn)
        {
            [self addChildViewController: vc];
            [self.view addSubview: vc.view];
    
            CGRect frame = vc.view.frame;
            frame.origin.x = frame.size.width;
            vc.view.frame = frame;
    
            frame.origin.x = 0;
            [UIView animateWithDuration: 0.33
                             animations: ^{
                                 vc.view.frame = frame;
                             }
             ];
        }
        else
        {
            [super presentViewController: vc animated: flag completion: completion];
        }
    }
    
    
    - (IBAction) backAction: (id) sender
    {
        if (_slideFromSide)
        {
            CGRect frame = self.view.frame;
            frame.origin.x = frame.size.width;
            [UIView animateWithDuration: 0.33
                             animations: ^{
                                 self.view.frame = frame;
                             }
                             completion:^(BOOL finished) {
                                 [self removeFromParentViewController];
                             }
             ];
        }
        else
        {
            [self dismissViewControllerAnimated: YES completion: nil];
        }
    }
    

    Then, in the ViewControllers where I want to slide-in, I have:

    - (id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName: nibNameOrNil bundle: nibBundleOrNil];
        if (self)
        {
            self.slideFromSide = YES;
            // Whatever else you want to do
        }
    
        return self;
    }
    

    Calling a new ViewController is just like normal:

    WhateverViewController *vc = [WhateverViewController alloc] initWithNibName: nil bundle: nil];
    [self presentViewController: vc animated: YES completion: nil];
    
    0 讨论(0)
提交回复
热议问题