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

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

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

1

基于分屏导航实现动画

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

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

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

 2

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

 3

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

4 5

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

完成以后,ViewController.h文件中增长的代码以下:图片

 

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

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

6

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

7

设 置完成ImageView的Image属性后,再依次选中视图控制器,将Storyboard ID分别修改成page一、page二、page3。与模态视图的例子不一样,咱们不须要再建立视图控制器的子类。就本例而言,咱们只需展现一些图片。若是 须要处理动做事件,则须要自定义视图控制器的子类。

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

 

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

因为须要响应UIScrollView的事件,咱们在ViewController中实现了UIScrollViewDelegate协议。

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

 

  
  
  
  
  1. - (void)viewDidLoad 
  2.  
  3.  
  4. [super viewDidLoad]; 
  5.  
  6. // Do any additional setup after loading the view, typically from a nib. 
  7.  
  8. self.scrollView.contentSize  = CGSizeMake(self.view.frame.size.width*3, self.scrollView.frame.size.height); 
  9.  
  10. self.scrollView.frame = self.view.frame; 
  11.  
  12. UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
  13.  
  14. UIViewController* page1ViewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"page1"]; 
  15.  
  16. self.page1 = page1ViewController.view; 
  17.  
  18. self.page1.frame = CGRectMake(0.0f, 0.0f, 320.0f, 420.0f); 
  19.  
  20. UIViewController* page2ViewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"page2"]; 
  21.  
  22. self.page2 = page2ViewController.view; 
  23.  
  24. self.page2.frame = CGRectMake(320.0f, 0.0f, 320.0f, 420.0f); 
  25.  
  26. UIViewController* page3ViewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"page3"]; 
  27.  
  28. self.page3 = page3ViewController.view; 
  29.  
  30. self.page3.frame = CGRectMake(2 * 320.0f, 0.0f, 320.0f, 420.0f); 
  31.  
  32. self.scrollView.delegate = self; 
  33.  
  34. [self.scrollView addSubview:self.page1]; 
  35.  
  36. [self.scrollView addSubview:self.page2]; 
  37.  
  38. [self.scrollView addSubview:self.page3]; 
  39.  

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

 

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

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

 

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

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

运行代码,获得的效果

 8

相关文章
相关标签/搜索