本文先讲解简单的分段控制器UISegmentedControl的使用,然后具体讲解它最常使用的场景:同一个控制器中实现多个View的切换。


文章构思:

1、先直接讲解一张UI效果图的四种实现方式。

2、对UISegmentedControl类的各种属性和各种方法的讲解。


UISegmentedControl控件的很大的使用场景基本像下面这张图显示的一样,在同一个控制器中实现多个View的切换。

结合这张图,我先讲解下产品的要求。导航栏上面放置一个UISegmentedControl控件,可以切换“空间”数据、“活动”数据。并且空间数据的展示界面和活动数据的展示界面是不一样的UI布局。

当然,如果这多个界面的UI布局是一样的,不同的只是数据,那肯定就采用同一个控制器、同UI界面,赋予不同的数据,然后刷新就好了。

为了实现这样的效果,一般市面上有四种实现方案,我比较偏向使用第三种。第四种也就是将前面两种方法结合起来使用。


第一种方式:如上图所示,实现的思路就是使用UIScrollView控件,将ViewA和ViewB都放置在UIScrollView中,然后当点击UISegmentedControl控件时,使用UIScrollView对象的内容偏移的方式,达到所需效果。

好处:两个View是放置在ScrollView上面的,View切换过程中,比较顺畅、可以同时存在ViewA的右半部分、ViewB的左半部分。

坏处:ViewA和ViewB都是由VCA这样一个控制器控制的。包括ViewA和ViewB上面数据的请求、数据的处理、界面交互的处理等等事宜,都是由VCA控制器来处理。这样的话,势必造成VCA代码比较混乱,不方便管理。


第二种方式:如上图所示,让ViewA有自己的控制器VCA、ViewB也有自己的控制器VCB,让ViewB放置在ViewA上面就行了。只是在这个过程中,不能简单的只调用addSubView:方法,还有使用addChildViewController:方法。

苹果官方的解释:

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

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

这样做的好处:

1.无疑,对页面中的逻辑更加分明了。相应的View对应相应的ViewController。

2.当某个子View没有显示时,将不会被Load,减少了内存的使用。

3.当内存紧张时,没有Load的View将被首先释放,优化了程序的内存释放机制。

然后这里就涉及到addChildViewController等方法的使用,网上对它的介绍内容比较繁多,总结起来其实也就是下面这个代码,使用的时候照搬即可:

if (添加controller控制器) {
[self addChildViewController:controller];
[controller didMoveToParentViewController:self];
} else {// 删除controller控制器
[controller willMoveToParentViewController:nil];
[controller removeFromParentViewController];
}

现在直接给出,完成项目要求的相关代码:(不能直接使用,主要是看方法)

@property (nonatomic, strong) UISegmentedControl *segmentedControl;
@property (nonatomic, strong) WSFShopActivityListVC *shopActivityListVC; - (UISegmentedControl *)segmentedControl {
if (!_segmentedControl) {
_segmentedControl = [[UISegmentedControl alloc] initWithItems:@[@"空间",@"活动"]];
_segmentedControl.frame = CGRectMake(, , , );
_segmentedControl.selectedSegmentIndex = ;
_segmentedControl.tintColor = [UIColor whiteColor];
_segmentedControl.layer.cornerRadius = ;
_segmentedControl.layer.masksToBounds = YES;
_segmentedControl.layer.borderWidth = ;
_segmentedControl.layer.borderColor = [UIColor whiteColor].CGColor;
[_segmentedControl addTarget:self action:@selector(indexDidChangeForSegmentedControl:)
forControlEvents:UIControlEventValueChanged];
}
return _segmentedControl;
}
- (WSFShopActivityListVC *)shopActivityListVC {
if (!_shopActivityListVC) {
_shopActivityListVC = [[WSFShopActivityListVC alloc] init];
}
return _shopActivityListVC;
} #pragma mark - UISegmentedControl协议方法
- (void)indexDidChangeForSegmentedControl:(UISegmentedControl *)sender {
switch(sender.selectedSegmentIndex){
case :
sender.selectedSegmentIndex = ; [self.shopActivityListVC.view removeFromSuperview];
[self.shopActivityListVC willMoveToParentViewController:nil];
[self.shopActivityListVC removeFromParentViewController]; break;
case :
sender.selectedSegmentIndex = ; [self.view addSubview:self.shopActivityListVC.view];
[self addChildViewController:self.shopActivityListVC];
[self.shopActivityListVC didMoveToParentViewController:self]; break; default:
break;
}
}

第三种实现方式:如上图所示,VCC专门作为一个控制器容器,轮流着将ViewA和ViewB添加到ViewC上面。


当然,还可以将前面两种思路综合起来使用,思路如下图:

第四种方式:如上如所示,使用了另外一个“专门的ViewController容器”VCC。结合第一种、第二种的思路应该是很好理解上图的,这里就不多说了。


使用注意事项:

1、对于SKStoreProductViewController这类控制器,设计者只允许将它模态跳转出来。此时使用addChildViewController是会报错的。

具体使用可以参看这片文章【https://www.cnblogs.com/cchHers/p/9099421.html】。

最后对于 UISegmentedControl控件的各种属性、各种方法的说明,我就先不往下写了。以后有时间在更新~

~暂时就这么多内容了。

最新文章

  1. C语言基本点初探
  2. iPhone 6/iPhone 6 Plus硬件性能
  3. MFC学习 进程间通信
  4. asp.net中如何绑定combox下拉框数据(调用存储过程)
  5. poj 1273 Drainage Ditches(最大流)
  6. liunx环境下的mysql数据库配置文件my.conf内的参数含义
  7. 双人五子棋对战(需要EasyX图像库)
  8. DirectShow初探
  9. 将批量下载的博客导入到手机后,通过豆约翰博客阅读器APP(Android手机)进行浏览,白字黑底,保护眼睛,图文并茂。
  10. Linux学习2
  11. -_-#【AJAX】XMLHttpRequest
  12. openstack 开发step-by-step
  13. Linux账号管理(二)
  14. C++ STL快速入门
  15. POJ 2359 Questions(约瑟夫环——数学解法)
  16. python坑之input获取字符串
  17. 如何设置Linux(Centos)系统定期任务(corntab详细用法)
  18. Java虚拟机判定对象存活算法
  19. es6入门4--promise详解
  20. 设计模式-结构型模式, mvc 模型视图控制器模式(8)

热门文章

  1. mysql学习笔记(二:中的auto_increment 理解
  2. IDEA部署项目,并结合Shell脚本运行Java程序
  3. Java入门笔记 03-面向对象(下)
  4. .NET Core快速入门教程 3、使用VS Code开发.NET Core控制台应用程序
  5. Django框架之模板语言特殊标记(将后端的数据显示到前端)
  6. 解决小程序报错 Page "pages/index/main" has not been registered yet.
  7. 使用命令将单个java文件打包为jar
  8. mysql 默认信息
  9. 判断一个数组是否包含一个指定的值 includes-ES6
  10. base64相关