平铺导航模式是非常重要的导航模式。一般用于简单的扁平化信息浏览或任务。扁平化信息是指这些信息之间没有从属的层次关系,如中国的城市中北京、上 海和哈尔滨之间是扁平化信息,而哈尔滨市与黑龙江省之间的关系是从属的层次关系,层次关系信息可以采用标签导航和树形结构导航。

从一个案例开始介绍平铺导航。如果我想为开发一个基于iPhone的“画廊”应用,目前只有3幅名画(左图是毕加索-哭泣、中图是达芬奇-蒙娜丽莎、右图是罗丹-思想者)收录到应用中。由于这3幅名画之间没有层次关系,他们之间是扁平的。

基于分屏导航实现

基于分屏导航是平铺导航模式的主要实现方式,主要涉及的控件有:分屏控件(UIPageControl)和ScrollView,分屏控件是iOS标准控件。

基 于分屏导航的手势有两种,一个是点击小点的左边(上边)或右边(下边)实现翻屏,另一个是用手在屏幕上滑动实现翻屏。屏幕的总数应该限制在20个 以内,超过20个分屏控件的小点就会溢出。事实上,如果一个应用超过10屏,此时使用基于分屏导航的平铺导航模式已经不是很方便了。

下面我 们采用基于分屏导航模式实现“画廊”应用。使用Single View Application模板创建一个名为PageControlNavigation的工程。将ScrollView和PageControl控件拖曳到 设计界面,将其摆放到合适的位置,通过属性将视图背景设置为黑色。

在Interface Builder中选中ScrollView控件,打开其属性检查器,设置Scrollers中的属性,此时该ScrollView控件不显示水平和垂直滚动条,但可以滚动也可以分屏。

在Interface Builder中选中PageControl控件,打开其属性检查器,设置Pages中“# of Pages”(总屏数)属性为3,Current(当前屏)属性为0。再打开尺寸检查器,修改Width(宽度)属性为200,将这个属性设置大一些是为 了便于手指点击。

 

最后,还需要为这两个控件定义输出口并连线,而且要为分屏控件控件定义响应屏幕变化事件的方法changePage:并连线。

完成之后,ViewController.h文件中增加的代码如下:

  1. @property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
  2. @property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
  3. - (IBAction)changePage:(id)sender;

下面设计3个视图,将3个View Controller视图控制器拖曳到MainStoryboard.storyboard的设计界面中,然后再并分别拖曳3个ImageView到3个不同视图上。

然后再分别修改3个ImageView的Image属性为名画的文件名。

设 置完成ImageView的Image属性后,再依次选中视图控制器,将Storyboard ID分别修改为page1、page2、page3。与模态视图的例子不同,我们不需要再创建视图控制器的子类。就本例而言,我们只需展示一些图片。如果 需要处理动作事件,则需要自定义视图控制器的子类。

设计完成后,我们看看程序代码ViewController.h:

  1. #import <UIKit/UIKit.h>
  2. @interface ViewController : UIViewController <UIScrollViewDelegate>
  3. @property (strong, nonatomic) UIView *page1;
  4. @property (strong, nonatomic) UIView *page2;
  5. @property (strong, nonatomic) UIView *page3;
  6. @property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
  7. @property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
  8. - (IBAction)changePage:(id)sender;
  9. @end

由于需要响应UIScrollView的事件,我们在ViewController中实现了UIScrollViewDelegate协议。

下面我们看看ViewController.m中viewDidLoad方法的代码:

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. // Do any additional setup after loading the view, typically from a nib.
  5. self.scrollView.contentSize  = CGSizeMake(self.view.frame.size.width*3, self.scrollView.frame.size.height);
  6. self.scrollView.frame = self.view.frame;
  7. UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
  8. UIViewController* page1ViewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"page1"];
  9. self.page1 = page1ViewController.view;
  10. self.page1.frame = CGRectMake(0.0f, 0.0f, 320.0f, 420.0f);
  11. UIViewController* page2ViewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"page2"];
  12. self.page2 = page2ViewController.view;
  13. self.page2.frame = CGRectMake(320.0f, 0.0f, 320.0f, 420.0f);
  14. UIViewController* page3ViewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"page3"];
  15. self.page3 = page3ViewController.view;
  16. self.page3.frame = CGRectMake(2 * 320.0f, 0.0f, 320.0f, 420.0f);
  17. self.scrollView.delegate = self;
  18. [self.scrollView addSubview:self.page1];
  19. [self.scrollView addSubview:self.page2];
  20. [self.scrollView addSubview:self.page3];
  21. }

该 方法主要进行控件初始化,由于需要计算各个控件的位置,代码比较多,但是基本上没什么难点。self.scrollView.delegate = self是把当前视图控制(UIScrollViewDelegate实现对象)分配给ScrollView控件,以便响应事件处理,其他事件是 scrollViewDidScroll:,其代码如下:

  1. - (void) scrollViewDidScroll: (UIScrollView *) aScrollView
  2. {
  3. CGPoint offset = aScrollView.contentOffset;
  4. self.pageControl.currentPage = offset.x / 320.0f;
  5. }

当左右滑动屏幕,ScrollView控件滚动完成的时候,要计算和设定分屏控件的当前屏currentPage。当点击分屏控件时屏幕发生变化,此时触发changePage:方法,其代码如下:

  1. - (IBAction)changePage:(id)sender
  2. {
  3. [UIView animateWithDuration:0.3f animations:^{
  4. int whichPage = self.pageControl.currentPage;
  5. self.scrollView.contentOffset = CGPointMake(320.0f * whichPage, 0.0f);
  6. }];
  7. }

在 上述代码中,我们根据分屏控件当前屏幕属性(currentPage)重新调整了ScrollView控件的偏移量,而且为了使屏幕变化产生动画 效果,使用了[UIView animateWithDuration:0.3f animations:^{ …}]代码,重新调整ScrollView控件偏移量。

运行代码,得到的效果

iOS开发那些事-平铺导航–基于分屏导航及案例实现相关推荐

  1. iOS开发那些事-平铺导航-基于Page的导航及案例实现

    基于分页导航实现 在iOS 5之后,可以使用分页控制器(UIPageViewController)构建类似于电子书效果的应用,我们称为基于分页的应用.一个分页应用有很多相关的视图控制器 分页控制器(P ...

  2. iOS开发那些事-故事板实现标签导航

    故事板实现标签导航 用故事板技术实现标签导航模式. 使用"Tabbed Application"模版,创建一个名为 "TabNavigationStoryborad&qu ...

  3. iOS开发那些事--创建基于故事板的iOS 6的HelloWorld

    基于故事板的HelloWorld工程 Storyboard(故事板)是用来替代xib的技术,也是iOS 5最重要的新特性之一.我们用Storyboard(故事板)重构HelloWorld. 使用故事板 ...

  4. iOS开发那些事-Passbook详解与开发案例

    Passbook是iOS 6的新功能,只能在iPhone和iPod touch设备中使用.它可以帮助我们管理商家发放的电子会员卡.积分卡. 优惠券等.这将对未来电子商务产生深远的影响.商家通过发放会员 ...

  5. iOS开发那些事-Passbook详解与开发案例(附视频)

    Passbook是iOS 6的新功能,只能在iPhone和iPod touch设备中使用.它可以帮助我们管理商家发放的电子会员卡.积分卡.优惠券等.这将对未来电子商务产生深远的影响.商家通过发放会员卡 ...

  6. iOS开发 搭建视频直播系统,基于LFLiveKit+ijkplayer+rtmp(iOS端)

    本文主要使用的三个技术: 推流:LFLiveKit 播放:ijkplayer 服务器:nginx+rtmp+ffmpeg 有了这三点技术就可以完成一个简约的直播系统.效果图如下(右边的是用模拟器设备运 ...

  7. iOS开发那些事-表视图UI设计模式

    软件设计中有设计模式,在UI设计方面也有设计模式.由于表视图的应用在iOS中极其广泛,本节向大家介绍表视图中两个UI设计模式:分页模式和下拉刷新(Pull-to-Refresh)模式.这两种模式已经成 ...

  8. iOS开发那些事--iOS6 UI状态保持和恢复

    iOS设计规范中要求,当应用退出的时候(包括被终止运行时候),画面中UI元素状态需要保持的,当再次进来的时候看状态与退出是一样的.iOS6之后苹果提供以下API使得UI状态保持和恢复变得很容易了. 在 ...

  9. iOS开发那些事-Git在Xcode中的配置与使用

    很多Git命令都是在命令行下运行的,命令行下管理Git有很多优点不用多说.但最大的缺点是要求用户记住这些命令.因此Git图形界面还是很受一 些用户欢迎的,其中Xcode作为集成开发环境工具,也提供了一 ...

最新文章

  1. OAuth2.0学习(1-1)OAuth2.0是什么?
  2. [QTP] 描述性编程
  3. Python中Function(函数)和method(方法)
  4. .net中的硬盘操作(针对Windows )
  5. 王道考研 计算机网络6 OSI参考模型和各层作用
  6. 深度学习中 epoch,[batch size], iterations概念解释
  7. filter 函数 map 函数 reduce函数 介绍
  8. python重复元素判定去除_Python去除列表中重复元素的方法
  9. java1.8+pydev_Ubuntu 18.04.4 中使用 Eclipse+PyDev 配置 Python 开发环境
  10. linux中目录的作用是什么,在linux文件系统中,/etc 目录的作用到底是干什么用的?...
  11. 关于使用 myeclipse连接MySql的问题
  12. 这款扩音器让我见识了什么才是地摊神器,震撼的声音通透整条街
  13. 生物化学复习题I·蛋白质
  14. ios设备开发教程-利用app申请ios开发证书及描述文件
  15. 24个足以改变事业的商业妙想
  16. python爬虫12306查票
  17. 时间类及数组,集合 7-14
  18. 模式识别算法之2--感知器(感知机)算法
  19. 幸福公开课字幕 中英文全
  20. 解决“c#:未将对象引用设置到对象的实例”

热门文章

  1. 查看mysql日志文件大小和数据库大小
  2. 使用ionic创建IOS和Android 应用总结
  3. 多数大数据项目都以失败而告终的原因
  4. 说说Android桌面(Launcher应用)背后的故事(二)——应用程序的添加
  5. 给Visual Studio 2010中文版添加Windows Phone 7模板
  6. NetDevOps — netmiko
  7. C 语言编程 — 函数
  8. Ceph 客户端的 RPM 包升级问题
  9. python_控制台输出带颜色的文字方法
  10. matlab-高数 find 找到集合中特定元素的位置