认识 - 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;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,719评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,337评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,887评论 0 324
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,488评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,313评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,284评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,672评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,346评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,644评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,700评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,457评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,316评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,706评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,261评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,648评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,859评论 2 335

推荐阅读更多精彩内容