认识 - transitionFromViewController:toViewController:duration:options:animations:completion:

标签: iOS,苹果开发文档


  • transitionFromViewController:toViewController:duration:options:animations:completion:
    Transitions between two of the view controller'��s child view controllers.

Declaration

SWIFT
func transitionFromViewController(_ fromViewController: UIViewController,
                 toViewController toViewController: UIViewController,
                         duration duration: NSTimeInterval,
                          options options: UIViewAnimationOptions,
                       animations animations: (() -> Void)?,
                       completion completion: ((Bool) -> Void)?)
OBJECTIVE-C
- (void)transitionFromViewController:(UIViewController * _Nonnull)fromViewController
                    toViewController:(UIViewController * _Nonnull)toViewController
                            duration:(NSTimeInterval)duration
                             options:(UIViewAnimationOptions)options
                          animations:(void (^ _Nullable)(void))animations
                          completion:(void (^ _Nullable)(BOOL finished))completion

Parameters

fromViewController
A view controller whose view is currently visible in the parent'��s view hierarchy.
toViewController
A child view controller whose view is not currently in the view hierarchy.
duration
The total duration of the animations, in seconds. If you pass zero, the changes are made without animating them.
options
A mask of options indicating how you want to perform the animations. For a list of valid constants, see UIViewAnimationOptions.
animations
A block object containing the changes to commit to the views. Here you programmatically change any animatable properties of the views in your view hierarchy. This block takes no parameters and has no return value. This parameter must not be NULL.
completion
A block to be called when the animation completes.
The block takes the following parameters:
finished
YES if the animation finished; NO if it was skipped.

Discussion

This method adds the second view controller'��s view to the view hierarchy and then performs the animations defined in your animations block. After the animation completes, it removes the first view controller'��s view from the view hierarchy.

This method is only intended to be called by an implementation of a custom container view controller. If you override this method, you must call super in your implementation.

Availability

Available in iOS 5.0 and later.

1.背景

iOS 5.0 以前 ,我们在一个视图控制器中会用addSubView方法来添加很多子View,并进行对这些子View的控制。
但是,这样做,有一个问题:

一个UIViewController的View可能有很多小的子view。这些子view很多时候被盖在最后,我们在最外层ViewController的viewDidLoad方法中,用addSubview增加了大量的子view。这些子view大多数不会一直处于界面上,只是在某些情况下才会出现,例如登陆失败的提示view,上传附件成功的提示view,网络失败的提示view等。但是虽然这些view很少出现,但是我们却常常一直把它们放在内存中。另外,当收到内存警告时,我们只能自己手工把这些view从super view中去掉。

2.替代方法

聪明的你,也许已经体会到了,该transitionFromViewController方法闪亮登场:

苹果新的API增加了addChildViewController方法,并且希望我们在使用addSubview时,同时调用[self addChildViewController:child]方法将sub view对应的viewController也加到当前ViewController的管理中。

对于那些当前暂时不需要显示的subview,只通过addChildViewController把subViewController加进去;需要显示时再调用transitionFromViewController方法。将其添加进入底层的ViewController中。

这样做的好处:

  1. 无疑,对页面中的逻辑更加分明了。相应的View对应相应的ViewController。
  2. 当某个子View没有显示时,将不会被Load,减少了内存的使用。
  3. 当内存紧张时,没有Load的View将被首先释放,优化了程序的内存释放机制。

3.transitionFromViewController:toViewController:duration:options:animations:completion 方法

- (void)transitionFromViewController:(UIViewController *)fromViewControllertoViewController:(UIViewController *)toViewController duration:(NSTimeInterval)durationoptions:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

在两个子视图控制器中转换。支持的iOS 5.0以及以后的版本。

fromViewController:当前显示在父视图控制器中的子视图控制器
toViewController:将要显示的子视图控制器
duration:完成过渡的时间;单位:秒。
options:指定的过渡效果。
animations:转换过程中,的动画。是个Block块操作。
completion:过渡完成后,执行的Block块操作。

该方法,执行完以后,fromViewController指代的视图控制器的View将从界面消失;
toViewController所指代的视图控制器的View将被载入到页面中。

4.使用方法

  1. 在父ViewController中,使用方法,将各个子添加进来。
\- (void)viewDidLoad{
   [super viewDidLoad];
   // 对于不显示的子ViewController,要用addChildViewController方法,将其添加到父ViewController中
   firstViewController=[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
   [self addChildViewController:firstViewController];
   secondViewController=[[SecondViewController alloc] initWithNibName:@"SecondViewController"bundle:nil];
   [self addChildViewController:secondViewController];
   thirdViewController=[[ThirdViewController alloc] initWithNibName:@"ThirdViewController" bundle:nil];
   [self addChildViewController:thirdViewController];
   // 需要显示的子ViewController,要将其View添加到父View中
   [self.view addSubview:thirdViewController.view];
   currentViewController=thirdViewController;
}
  1. 根据按钮事件,来transitionFromViewController方法来切换相应的子View
-(IBAction)onClickbutton:(id)sender
{
    if ((currentViewController==firstViewController&&[sender tag]==1)||(currentViewController==secondViewController&&[sender tag]==2) ||(currentViewController==thirdViewController&&[sender tag]==3) ) {
        return;
    }
    UIViewController *oldViewController=currentViewController;
    switch ([sender tag]) {
        case 1:{
            NSLog(@"留言及回复");
            [self transitionFromViewController:currentViewController                 toViewController:firstViewController
                                      duration:1                        options:UIViewAnimationOptionTransitionCurlUp
                                    animations:^{
                                        // NOPS;
                                    }
                                    completion:^(BOOL finished) {
                                        if (finished) {
              currentViewController=firstViewController;
                                        }else{
           currentViewController=oldViewController;
                                        }
                                    }];
        }
            break;
        case 2:{
            NSLog(@"生日提醒");
            [self transitionFromViewController:currentViewController                           toViewController:secondViewController
                                      duration:1                  options:UIViewAnimationOptionTransitionCurlDown
                                    animations:^{
                                    }
                                    completion:^(BOOL finished) {
                                        if (finished) {             currentViewController=secondViewController;
                                        }else{                   currentViewController=oldViewController;
                                        }
                                    }];
        }
            break;
        case 3:
        {
            NSLog(@"好友申请");
            [self transitionFromViewController:currentViewController
                 toViewController:thirdViewController
                                      duration:1
     options:UIViewAnimationOptionTransitionCrossDissolve
                                    animations:^{
                                    }
                                    completion:^(BOOL finished) {
                                        if (finished) {                  currentViewController=thirdViewController;
                                        }else{
                 currentViewController=oldViewController;
                                        }
                                    }];
        }
            break;
        default:
            break;
    }
}

推荐阅读更多精彩内容

  • /* UIViewController is a generic controller base class th...
    DanDanC阅读 1,427评论 0 2
  • ViewsBecause view objects are the main way your applicati...
    梁光飞阅读 409评论 0 0
  • 文 by 达达 在深圳待了很多年的我们,还记得对她的第一印象吗? 上篇文章有提到,八月中旬,妈妈第一次来深圳。 那...
    Hdada阅读 348评论 0 3
  • txt:6X photo:网络 酒带来的欢乐是短暂的,如同一出芭蕾舞或音乐会一样, 但酒能鼓舞人生,并给予生活莫大...
    趣玩星球阅读 576评论 0 0
  • 今天讲评期中考试卷。散文文本用了林文钦的《中药芬芳》,在理解中药芬芳中“芬芳”一词的含义时,为了让学生理解芬芳这个...
    陌上花开我我我阅读 286评论 0 0
  • 张衡字平子,南阳西鄂人也。衡少善属文,游于三辅,因入京师,观太学,遂通五经,贯六艺。虽才高于世,而无骄尚之情。常从...
    熹嘻阅读 220评论 0 0