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

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

//
//  HMTMainViewController.m
//  UIScrollView
//
//  Created by HMT on 14-6-25.
//  Copyright (c) 2014年 humingtao. All rights reserved.
//#import "HMTMainViewController.h"
#import "HMTFirstViewController.h"
#import "HMTSecondViewController.h"
#import "HMTThirdViewController.h"@interface HMTMainViewController () <UIScrollViewDelegate>@property (nonatomic ,strong) HMTThirdViewController  *thirdVC;
@property (nonatomic ,strong) HMTFirstViewController  *firstVC;
@property (nonatomic ,strong) HMTSecondViewController *secondVC;@property (nonatomic ,strong) UIViewController *currentVC;@property (nonatomic ,strong) UIScrollView *headScrollView;  //  顶部滚动视图@property (nonatomic ,strong) NSArray *headArray;@end@implementation HMTMainViewController- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];if (self) {// Custom initialization}return self;
}- (void)viewDidLoad
{[super viewDidLoad];// Do any additional setup after loading the view.self.navigationItem.title = @"网易新闻Demo";self.headArray = @[@"头条",@"娱乐",@"体育",@"財经",@"科技",@"NBA",@"手机"];/***   automaticallyAdjustsScrollViewInsets   又被这个属性坑了*   我"UI高级"里面一篇文章着重讲了它,大家能够去看看*/self.automaticallyAdjustsScrollViewInsets = NO;self.headScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 64, 320, 40)];self.headScrollView.backgroundColor = [UIColor purpleColor];self.headScrollView.contentSize = CGSizeMake(560, 0);self.headScrollView.bounces = NO;self.headScrollView.pagingEnabled = YES;[self.view addSubview:self.headScrollView];for (int i = 0; i < [self.headArray count]; i++) {UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];button.frame = CGRectMake(0 + i*80, 0, 80, 40);[button setTitle:[self.headArray objectAtIndex:i] forState:UIControlStateNormal];button.tag = i + 100;[button addTarget:self action:@selector(didClickHeadButtonAction:) forControlEvents:UIControlEventTouchUpInside];[self.headScrollView addSubview:button];}/*苹果新的API添加了addChildViewController方法,而且希望我们在使用addSubview时,同一时候调用[self addChildViewController:child]方法将sub view相应的viewController也加到当前ViewController的管理中。对于那些当前临时不须要显示的subview,仅仅通过addChildViewController把subViewController加进去;须要显示时再调用transitionFromViewController方法。

将其加入进入底层的ViewController中。 这样做的优点: 1.无疑,对页面中的逻辑更加分明了。相应的View相应相应的ViewController。

2.当某个子View没有显示时,将不会被Load,降低了内存的使用。 3.当内存紧张时,没有Load的View将被首先释放,优化了程序的内存释放机制。 */ /** * 在iOS5中。ViewController中新加入了以下几个方法: * addChildViewController: * removeFromParentViewController * transitionFromViewController:toViewController:duration:options:animations:completion: * willMoveToParentViewController: * didMoveToParentViewController: */ self.firstVC = [[HMTFirstViewController alloc] init]; [self.firstVC.view setFrame:CGRectMake(0, 104, 320, 464)]; [self addChildViewController:_firstVC]; self.secondVC = [[HMTSecondViewController alloc] init]; [self.secondVC.view setFrame:CGRectMake(0, 104, 320, 464)]; self.thirdVC = [[HMTThirdViewController alloc] init]; [self.thirdVC.view setFrame:CGRectMake(0, 104, 320, 464)]; // 默认,第一个视图(你会发现,全程就这一个用了addSubview) [self.view addSubview:self.firstVC.view]; self.currentVC = self.firstVC; } - (void)didClickHeadButtonAction:(UIButton *)button { // 点击处于当前页面的按钮,直接跳出 if ((self.currentVC == self.firstVC && button.tag == 100)||(self.currentVC == self.secondVC && button.tag == 101.)) { return; }else{ // 展示2个,其余一样,自行补全噢 switch (button.tag) { case 100: [self replaceController:self.currentVC newController:self.firstVC]; break; case 101: [self replaceController:self.currentVC newController:self.secondVC]; break; case 102: //....... break; case 103: //....... break; case 104: //....... break; case 105: //....... break; case 106: //....... break; //....... default: break; } } } // 切换各个标签内容 - (void)replaceController:(UIViewController *)oldController newController:(UIViewController *)newController { /** * 着重介绍一下它 * transitionFromViewController:toViewController:duration:options:animations:completion: * fromViewController 当前显示在父视图控制器中的子视图控制器 * toViewController 将要显示的姿势图控制器 * duration 动画时间(这个属性,old friend 了 O(∩_∩)O) * options 动画效果(渐变,从下往上等等,详细查看API) * animations 转换过程中得动画 * completion 转换完毕 */ [self addChildViewController:newController]; [self transitionFromViewController:oldController toViewController:newController duration:2.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion:^(BOOL finished) { if (finished) { [newController didMoveToParentViewController:self]; [oldController willMoveToParentViewController:nil]; [oldController removeFromParentViewController]; self.currentVC = newController; }else{ self.currentVC = oldController; } }]; }

posted on 2017-06-17 16:17 mthoutai 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/mthoutai/p/7040531.html

iOS开发 剖析网易新闻标签栏视图切换(addChildViewController属性介绍)相关推荐

  1. IOS开发——仿网易新闻客户端

    IOS开发--仿网易新闻客户端 本文没有内容,传个资源 衔接地址:http://download.csdn.net/detail/u012881779/7152281 左侧导航部分: 新闻版块 订阅版 ...

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

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

  3. iOS开发8:使用Tool Bar切换视图

    之前讨论的都是单视图应用程序,而在实际应用中,我们可能要多个视图,并根据用户的需要切换视图. iOS中几种典型的多视图程序: (1)Tab Bar Application:程序的底部有一排按钮,轻触其 ...

  4. iOS开发——BAT网易笔试面试题参考答案

    阿里B2B - 一面 1,load方法执行顺序,分类和主类的load方法顺序,两个分类的load方法顺序,跟main函数的顺序 2,sqllite的跟orcale这些大型的数据库的机制有什么不同的? ...

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

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

  6. iOS开发系列课程(10) --- 表格视图

      UITableView(表格视图)是iOS应用程序开发中应用最广泛的一个控件,几乎十有八九的应用程序中都会用到它,它是基于滚动视图的列表互动类.使用UITableView可以在屏幕上显示单元格的列 ...

  7. iOS开发-ViewController的生命周期和切换

    ViewController在App开发中是至关重要的一环,无论是页面的展示和数据之间的交互,ViewController提供了一个框架可以管理和构建App应用.iOS中构建App提供了两种方式一种是 ...

  8. iOS开发------仿知乎上下滑动切换页面

    放松的时候看看知乎,生活不解的时候问问知乎,这貌似已经成为了生活中的一种习惯,它独特翻页方式也是本人喜欢的一个原因,通过上划与下滑进行页面的翻页,不必返回再进入下一个页面,显得非常的简介并且人性化,这 ...

  9. iOS开发学无止境 - Cell 里的视图控制器

    在每个 iOS 开发者的生涯中,总有一些时候想把一个视图控制器放到一个 tableView 的 cell 中.因为这是一个有用的工具去处理我在视图控制器中的各种复杂视图及繁琐操作,而且很容易想象的一种 ...

最新文章

  1. 南京邮电考研计算机科学大纲,2019年南京邮电大学811数据结构考研大纲
  2. android 工厂方法模式应用场景,Android设计模式(四)- 工厂方法模式
  3. new/delete与malloc/free的区别与联系详解
  4. Android 界面布局之RelativeLayout
  5. 【Python-随机旋转】图像随机旋转及坐标进行旋转原理
  6. 在视觉任务上大幅超越ReLU的新型激活函数
  7. Springboot利用poi导出excel下载
  8. android qt 串口通信,Qt串口通信开发之QSerialPort模块详细使用方法与实例
  9. 机器人启示录 百度影音_斯皮尔伯格筹备新作 《机器人启示录》有望启动
  10. windows防火墙ntp服务器_ad域windows ntp服务器配置详解
  11. 面向接口编程思想(的好处)
  12. 详解几个基本概念“标准差标准误差,方差均方差”
  13. 微信小程序 身份证号码验证 15/18位身份证号码验证的正则表达式总结(详细版)
  14. 解决from Crypto.Cipher import AES报错
  15. 自动化测试的三种测试报告模板
  16. 嵌入式软件管培生每日总结-第1天
  17. Oralce数据库ASM存储管理-存储IO故障,disk未及时offline分析,故障分析模板
  18. 网站被百度网址安全中心 警告 该怎么取消拦截提示
  19. 共享图书APP开发解决方案
  20. python rot13解密_ROT13 加密与解密

热门文章

  1. 一文搞定 Docker 容器技术与常用命令
  2. 从0到1,从概念到国际标准,蚂蚁共享智能凭什么?
  3. 2020 前端开源领域技术展望
  4. c++11新特性_c++11新特性(四)
  5. 朱峰谈概念设计(六):美术部门
  6. 让《弹射世界》告诉你,二次元游戏该如何打造社交系统?
  7. jQuery下table操作示例(附案例源码)
  8. alter database open resetlogs
  9. 【AWR】调整AWR数据采样时间间隔及历史快照保留时间
  10. bzoj 4515: [Sdoi2016]游戏