原文:http://blog.csdn.net/hmt20130412/article/details/34523235

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

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

【转】 iOS开发 剖析网易新闻标签栏视图切换(addChildViewController属性介绍)的更多相关文章

  1. iOS开发 剖析网易新闻标签栏视图切换(addChildViewController属性介绍)

    本文转载至 http://www.tuicool.com/articles/3ymMzub CSDN博客原文  http://blog.csdn.net/hmt20130412/article/det ...

  2. IOS开发--仿制网易新闻

    学习来源:袁峥老师的<快速集成App中顶部标题滚动条> 此次博文写的是按需求分析写代码,思路条理性杠杠的,可以提高的编码实现速度哦. 效果:   根据这个网易新闻的界面,需求分析:     ...

  3. iOS界面-仿网易新闻左侧抽屉式交互 续(添加新闻内容页和评论页手势)

     本文转载至  http://blog.csdn.net/totogo2010/article/details/8637430       1.介绍 有的博友看了上篇博文iOS界面-仿网易新闻左侧抽屉 ...

  4. IOS开发中UITableView(表视图)的滚动优化及自定义Cell

    IOS开发中UITableView(表视图)的滚动优化及自定义Cell IOS 开发中UITableView是非常常用的一个控件,我们平时在手机上看到的联系人列表,微信好友列表等都是通过UITable ...

  5. iOS开发app启动原理及视图和控制器的函数调用顺序

    main()函数是整个程序的入口,在程序启动之前,系统会调用exec()函数.在Unix中exec和system的不同在于,system是用shell来调用程序,相当于fork+exec+waitpi ...

  6. IOS之分析网易新闻存储数据(CoreData的使用,增删改查)

    用过网易新闻客户端的朋友们都知道,获取新闻列表时有的时候他会请求网络有时候不会,查看某条新闻的时候再返回会标注已经查看的效果,接下来分析一下是如何实现的. 首先: 1.网易新闻用CoreData存储了 ...

  7. iOS学习之网易新闻简易Demo

    简易NewsDemo代码分析 界面布局就不多说了.效果图:(自定义了三套Cell,最后一套Cell是页面最下方的"正在加载中..."Cell,图三.)         主要分析工程 ...

  8. iOS开发之创建颜色渐变视图View

    在iOS开发中有时需要自己自定义一个视图view的背景,而网上有人提出的在循环中不断alloc的方法设置其背景色渐变,会耗费很多内存和资源,极其不明智,而在CALayer中早就提供有图层渐变的类和相应 ...

  9. 基于VUE,VUX组件开发的网易新闻页面搭建过程

    根据妙味课堂上的一个教程练习总结,供自己复习用 一.功能介绍 一个网易新闻客户端的浏览页面,通过网易新闻的api接口实时获取新闻数据,用vux搭建样式框架,以轮播图,文字滚动,图文列表等形式把内容展示 ...

随机推荐

  1. libevent带负载均衡的多线程使用示例

    功能: 主线程根据负载工作线程负载均衡算法,每隔一秒钟向特定的工作线程发送一条字符串信息,工作线程简单的把字符串信息打开出来.   Makefile   eventtest : eventtest.c ...

  2. 常用的用户状态命令包括:whoami、id、groups、newgrp 等

    用户状态命令 常用的用户状态命令包括:whoami.id.groups.newgrp 等.

  3. The fundamental knowledge of Node JS.

    D3 JSJava scirpt is an awesome language for Internface Design.All Obejcts in JavaScirpt could be use ...

  4. common tar command

    Compress tar -cvzf jy2653.2.tgz jy2653.2 Decompress tar -xvf jy2653.1.tgz

  5. QQ互联 回调地址

    http://wiki.connect.qq.com/%E5%9B%9E%E8%B0%83%E5%9C%B0%E5%9D%80%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98% ...

  6. [Locked] Shortest Distance from All Buildings

    Shortest Distance from All Buildings You want to build a house on an empty land which reaches all bu ...

  7. 视频监控之VSCloud版本计划

    下个版本会加入 1.人脸检测和人脸识别功能 2. 车牌识别. https://code.google.com/p/vscloud/ 下载连接 https://sourceforge.net/proje ...

  8. angularJS promise $q

    Promise 一 介绍 1.什么是promise 我们知道JavaScript语言的执行环境是“单线程”,所谓单线程,就是一次只能够执行一个任务,如果有多个任务的话就要排队,前面一个任务完成后才可以 ...

  9. LibreOffice连接orcle 11g

    1.安装java 2.安装JDBC 官网下载 复制到/usr/java/jdk1.8.0_111/jre/lib/ext文件下

  10. python中如何判断list中是否包含某个元素

    在python中可以通过in和not in关键字来判读一个list中是否包含一个元素 pythontab = ['p','y','t','h','o','n','t','a','b'] if 't' ...