ios scrollview 重用

来源:互联网 发布:淘宝商品详情页模板 编辑:程序博客网 时间:2024/06/06 12:59

  本来只是打算介绍一下addChildViewController这个方法的,正好今天朋友去换工作面试问到网易新闻标签栏效果的实现,就结合它,用个小Demo实例介绍一下:(具体解释都写在了Demo里面的注释)

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. //  
  2. //  HMTMainViewController.m  
  3. //  UIScrollView  
  4. //  
  5. //  Created by HMT on 14-6-25.  
  6. //  Copyright (c) 2014年 humingtao. All rights reserved.  
  7. //  
  8.   
  9. #import "HMTMainViewController.h"  
  10. #import "HMTFirstViewController.h"  
  11. #import "HMTSecondViewController.h"  
  12. #import "HMTThirdViewController.h"  
  13.   
  14. @interface HMTMainViewController () <UIScrollViewDelegate>  
  15.   
  16. @property (nonatomic ,strong) HMTThirdViewController  *thirdVC;  
  17. @property (nonatomic ,strong) HMTFirstViewController  *firstVC;  
  18. @property (nonatomic ,strongHMTSecondViewController *secondVC;  
  19.   
  20. @property (nonatomic ,strongUIViewController *currentVC;  
  21.   
  22. @property (nonatomic ,strongUIScrollView *headScrollView;  //  顶部滚动视图  
  23.   
  24. @property (nonatomic ,strongNSArray *headArray;  
  25.   
  26. @end  
  27.   
  28. @implementation HMTMainViewController  
  29.   
  30. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  
  31. {  
  32.     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
  33.     if (self) {  
  34.         // Custom initialization  
  35.     }  
  36.     return self;  
  37. }  
  38.   
  39. - (void)viewDidLoad  
  40. {  
  41.     [super viewDidLoad];  
  42.     // Do any additional setup after loading the view.  
  43.      
  44.     self.navigationItem.title = @"网易新闻Demo";  
  45.       
  46.     self.headArray = @[@"头条",@"娱乐",@"体育",@"财经",@"科技",@"NBA",@"手机"];  
  47.     /** 
  48.      *   automaticallyAdjustsScrollViewInsets   又被这个属性坑了 
  49.      *   我"UI高级"里面一篇文章着重讲了它,大家可以去看看 
  50.      */  
  51.     self.automaticallyAdjustsScrollViewInsets = NO;  
  52.     self.headScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(06432040)];  
  53.     self.headScrollView.backgroundColor = [UIColor purpleColor];  
  54.     self.headScrollView.contentSize = CGSizeMake(5600);  
  55.     self.headScrollView.bounces = NO;  
  56.     self.headScrollView.pagingEnabled = YES;  
  57.     [self.view addSubview:self.headScrollView];  
  58.     for (int i = 0; i < [self.headArray count]; i++) {  
  59.           
  60.         UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];  
  61.         button.frame = CGRectMake(0 + i*8008040);  
  62.         [button setTitle:[self.headArray objectAtIndex:i] forState:UIControlStateNormal];  
  63.         button.tag = i + 100;  
  64.         [button addTarget:self action:@selector(didClickHeadButtonAction:) forControlEvents:UIControlEventTouchUpInside];  
  65.         [self.headScrollView addSubview:button];  
  66.           
  67.     }  
  68.       
  69.     /* 
  70.      苹果新的API增加了addChildViewController方法,并且希望我们在使用addSubview时,同时调用[self addChildViewController:child]方法将sub view对应的viewController也加到当前ViewController的管理中。 
  71.      对于那些当前暂时不需要显示的subview,只通过addChildViewController把subViewController加进去;需要显示时再调用transitionFromViewController方法。将其添加进入底层的ViewController中。 
  72.      这样做的好处: 
  73.       
  74.      1.无疑,对页面中的逻辑更加分明了。相应的View对应相应的ViewController。 
  75.      2.当某个子View没有显示时,将不会被Load,减少了内存的使用。 
  76.      3.当内存紧张时,没有Load的View将被首先释放,优化了程序的内存释放机制。 
  77.      */  
  78.       
  79.     /** 
  80.      *  在iOS5中,ViewController中新添加了下面几个方法: 
  81.      *  addChildViewController: 
  82.      *  removeFromParentViewController 
  83.      *  transitionFromViewController:toViewController:duration:options:animations:completion: 
  84.      *  willMoveToParentViewController: 
  85.      *  didMoveToParentViewController: 
  86.      */  
  87.     self.firstVC = [[HMTFirstViewController alloc] init];  
  88.     [self.firstVC.view setFrame:CGRectMake(0104320464)];  
  89.     [self addChildViewController:_firstVC];  
  90.       
  91.     self.secondVC = [[HMTSecondViewController alloc] init];  
  92.     [self.secondVC.view setFrame:CGRectMake(0104320464)];  
  93.       
  94.     self.thirdVC = [[HMTThirdViewController alloc] init];  
  95.     [self.thirdVC.view setFrame:CGRectMake(0104320464)];  
  96.       
  97.     //  默认,第一个视图(你会发现,全程就这一个用了addSubview)  
  98.     [self.view addSubview:self.firstVC.view];  
  99.     self.currentVC = self.firstVC;  
  100.       
  101. }  
  102.   
  103. - (void)didClickHeadButtonAction:(UIButton *)button  
  104. {  
  105.     //  点击处于当前页面的按钮,直接跳出  
  106.     if ((self.currentVC == self.firstVC && button.tag == 100)||(self.currentVC == self.secondVC && button.tag == 101.)) {  
  107.         return;  
  108.     }else{  
  109.       
  110.         //  展示2个,其余一样,自行补全噢  
  111.         switch (button.tag) {  
  112.             case 100:  
  113.                 [self replaceController:self.currentVC newController:self.firstVC];  
  114.                 break;  
  115.             case 101:  
  116.                 [self replaceController:self.currentVC newController:self.secondVC];  
  117.                 break;  
  118.             case 102:  
  119.                 //.......  
  120.                 break;  
  121.             case 103:  
  122.                 //.......  
  123.                 break;  
  124.             case 104:  
  125.                 //.......  
  126.                 break;  
  127.             case 105:  
  128.                 //.......  
  129.                 break;  
  130.             case 106:  
  131.                 //.......  
  132.                 break;  
  133.                 //.......  
  134.             default:  
  135.                 break;  
  136.         }  
  137.     }  
  138.   
  139. }  
  140.   
  141. //  切换各个标签内容  
  142. - (void)replaceController:(UIViewController *)oldController newController:(UIViewController *)newController  
  143. {  
  144.     /** 
  145.      *            着重介绍一下它 
  146.      *  transitionFromViewController:toViewController:duration:options:animations:completion: 
  147.      *  fromViewController      当前显示在父视图控制器中的子视图控制器 
  148.      *  toViewController        将要显示的姿势图控制器 
  149.      *  duration                动画时间(这个属性,old friend 了 O(∩_∩)O) 
  150.      *  options                 动画效果(渐变,从下往上等等,具体查看API) 
  151.      *  animations              转换过程中得动画 
  152.      *  completion              转换完成 
  153.      */  
  154.       
  155.     [self addChildViewController:newController];  
  156.     [self transitionFromViewController:oldController toViewController:newController duration:2.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion:^(BOOL finished) {  
  157.                   
  158.         if (finished) {  
  159.                       
  160.             [newController didMoveToParentViewController:self];  
  161.             [oldController willMoveToParentViewController:nil];  
  162.             [oldController removeFromParentViewController];  
  163.             self.currentVC = newController;  
  164.                   
  165.         }else{  
  166.                       
  167.             self.currentVC = oldController;  
  168.                   
  169.         }  
  170. 转载至:http://blog.csdn.net/hmt20130412/article/details/34523235
  171.    
 
监听键盘事件
 
将PDF文件Open In MyApp


iOS 5.0 后UIViewController新增:willMoveToParentViewController和didMoveToParentViewCon  

2013-08-14 11:28:50|  分类:object-c ios |  标签:|举报|字号 订阅

在iOS 5.0以前,我们在一个UIViewController中这样组织相关的UIView

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

在iOS 5.0及以后,iOS为UIViewController类添加了新的属性和方法:

@property(nonatomic,readonly) NSArray *childViewControllers


- (void)addChildViewController:(UIViewController *)childController

- (void) removeFromParentViewController

- (void)transitionFromViewController::::::

- (void)willMoveToParentViewController:(UIViewController *)parent

- (void)didMoveToParentViewController:(UIViewController *)parent


这样,就能够将一个页面中的UIViewController控制起来,而不是混乱的共用一个UIViewController
,最重要的是,编程习惯的革命:降低了功能的耦合度!

写这篇博客,仅仅是讲以上5个方法!仅此而已。因为当我在百度或者谷歌中,输入以上5个方法的名字后,查出来的,并没有告诉这5个方法起到如何的作用?如何使用?

所以,我仅仅是想从API角度来谈一谈,这5个方法。
废话不多说了!

先搞清楚一个今天提到的概念:

[父视图控制器addChildViewController:子视图控制器];


在此,图控制器A添加了另一个图控制器B,那么A充当父视图控制器,B充当子视图控制器。父视图控制器充当了视图控制器容器的角色。

addChildViewController方法:

- (void)addChildViewController:(UIViewController *)childController

向视图控制器容器中添加子视图控制器


childController:子视图控制器


当要添加的子视图控制器已经包含在视图控制器容器中,那么,相当于先从父视图控制器中删除,然后重新添加到父视图控制器中。


removeFromParentViewController 方法

- (void)removeFromParentViewController

从父视图控制器中删除。


transitionFromViewController 方法

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


交换两个子视图控制器的位置(由于添加的顺序不同,所以子试图控制器在父视图控制器中存在层次关系)


fromViewController:当前显示的子试图控制器,将被替换为非显示状态

toViewController:将要显示的子视图控制器

duration:交换动画持续的时间,单位秒

options:动画的方式

animations:动画Block

completion:完成后执行的Block


willMoveToParentViewController 方法

- (void)willMoveToParentViewController:(UIViewController *)parent

当一个视图控制器从视图控制器容器中被添加或者被删除之前,该方法被调用


parent:父视图控制器,如果没有父视图控制器,将为nil


注意点:

1.当我们向我们的视图控制器容器中调用removeFromParentViewController方法时,必须要先调用该方法,且parent参数为nil:

[将要删除的视图控制器willMoveToParentViewController:nil];

2.当我们调用addChildViewController方法时,在添加子视图控制器之前将自动调用该方法。所以,就不需要我们显示调用了。


didMoveToParentViewController 方法

- (void)didMoveToParentViewController:(UIViewController *)parent

当从一个视图控制容器中添加或者移除viewController后,该方法被调用。

parent:父视图控制器,如果没有父视图控制器,将为nil


当我们向我们的视图控制器容器(就是父视图控制器,它调用addChildViewController方法加入子视图控制器,它就成为了视图控制器的容器)中添加(或者删除)子视图控制器后,必须调用该方法,告诉iOS,已经完成添加(或删除)子控制器的操作。


removeFromParentViewController 方法会自动调用了该方法,所以,删除子控制器后,不需要在显示的调用该方法了。

其实,这几个方法中的API说明,看的还懂。

最后,

关于willMoveToParentViewController方法和didMoveToParentViewController方法的使用


1.这两个方法用在子试图控制器交换的时候调用!即调用transitionFromViewController 方法时,调用。

2.当调用willMoveToParentViewController方法或didMoveToParentViewController方法时,要注意他们的参数使用:
当某个子视图控制器将从父视图控制器中删除时,parent参数为nil。
即:[将被删除的子试图控制器willMoveToParentViewController:nil];
当某个子试图控制器将加入到父视图控制器时,parent参数为父视图控制器。
即:[将被加入的子视图控制器 didMoveToParentViewController:父视图控制器];

3.无需调用[子视图控制器willMoveToParentViewController:父视图控制器]方法。因为我们调用[父视图控制器addChildViewController:子视图控制器]时,已经默认调用了。
只需要在transitionFromViewController方法后,调用[子视图控制器didMoveToParentViewController:父视图控制器];

4.无需调用[子视图控制器didMoveToParentViewController:父视图控制器]方法。因为我们调用
[子视图控制器 removeFromParentViewController]时,已经默认调用了。
只需要在transitionFromViewController方法之前调用:[子视图控制器willMoveToParentViewController:nil]。

希望对你有所帮助!



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 不喂母乳涨奶怎么办 螺丝和螺母跟转怎么办 六棱螺丝滑丝了怎么办 苹果6螺丝滑牙了怎么办 外六角螺丝圆了怎么办 小螺丝拧花了怎么办 老人退伍证丢了怎么办 狗狗又拉又吐怎么办 孕妇吃了马兰头怎么办 怀孕吃了马兰头怎么办 吃了茭白和豆腐怎么办 电气焊加工怎么办环评 手上皮肤干燥起皮怎么办 脸上起皮怎么办还痒痒 店铺4周被释放了怎么办 炫舞账号忘了怎么办 椎基底供血不足怎么办? 脑动脉供血不足怎么办 颈椎引起的脑供血不足怎么办 军人保障卡怎么办假的 正常形态精子率低怎么办 前向运动精子21怎么办 前向运动精子22%怎么办 前向运动精子19%怎么办 前向运动精子为0怎么办 被蝎子草扎了怎么办 二年级孩子成绩差怎么办 长治医保卡丢了怎么办 农商银行倒闭钱怎么办 2相电变3相电怎么办 电机六根线乱了怎么办 三相电零线带电怎么办 孕30周胎盘偏厚怎么办 偏侧咀嚼大小脸怎么办 咀嚼导致的脸歪怎么办 30岁了不想长大怎么办 4岁宝宝沉迷手机怎么办 我沉迷于了游戏怎么办 学生小红本丢了怎么办 小学玩6年初中怎么办 鼻炎喘不过来气怎么办