`

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

阅读更多

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

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

1

基于分屏导航实现

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

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

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

 2

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

 3

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

4 5

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

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

@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;

@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;

- (IBAction)changePage:(id)sender;

 

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

6

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

7

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

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

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIScrollViewDelegate>

@property (strong, nonatomic) UIView *page1;

@property (strong, nonatomic) UIView *page2;

@property (strong, nonatomic) UIView *page3;

@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;

@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;

- (IBAction)changePage:(id)sender;

@end

 

 

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

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

- (void)viewDidLoad

{

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

self.scrollView.contentSize  = CGSizeMake(self.view.frame.size.width*3, self.scrollView.frame.size.height);

self.scrollView.frame = self.view.frame;

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

UIViewController* page1ViewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"page1"];

self.page1 = page1ViewController.view;

self.page1.frame = CGRectMake(0.0f, 0.0f, 320.0f, 420.0f);

UIViewController* page2ViewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"page2"];

self.page2 = page2ViewController.view;

self.page2.frame = CGRectMake(320.0f, 0.0f, 320.0f, 420.0f);

UIViewController* page3ViewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"page3"];

self.page3 = page3ViewController.view;

self.page3.frame = CGRectMake(2 * 320.0f, 0.0f, 320.0f, 420.0f);

self.scrollView.delegate = self;

[self.scrollView addSubview:self.page1];

[self.scrollView addSubview:self.page2];

[self.scrollView addSubview:self.page3];

}

 

 

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

- (void) scrollViewDidScroll: (UIScrollView *) aScrollView

{

CGPoint offset = aScrollView.contentOffset;

self.pageControl.currentPage = offset.x / 320.0f;

}

 

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

- (IBAction)changePage:(id)sender

{

[UIView animateWithDuration:0.3f animations:^{

int whichPage = self.pageControl.currentPage;

self.scrollView.contentOffset = CGPointMake(320.0f * whichPage, 0.0f);

}];

}

 

 

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

运行代码,得到的效果

 8

分享到:
评论

相关推荐

    iOS开发视频教程

    资源名称:iOS开发视频教程资源目录:【】iOS开发视频教程-第01讲-iOS历史介绍【】iOS开发视频教程-第02讲-XCode安装【】iOS开发视频教程-第03讲-UIView_PPT【】iOS开发视频教程-第04讲-UILabel【】iOS开发视频教程-...

    iOS6开发指南视频源码ppt-视图控制器与导航模式.rar

    OS6开发指南视频-源码ppt:视图控制器与导航模式 通过本章的学习你已经可以判断你的应用是不是需要一个导航功能,并且知道在什么情况下选择平铺页面导航、标签导航、树形结构导航中的哪一种或者同时综合使用三种导航...

    ios-swift ---自定义导航栏.zip

    在iOS应用开发中,导航栏(Navigation Bar)是UI设计中的关键组成部分,它为用户提供了一种在层级结构间导航的方式。Swift是Apple为iOS、iPadOS、watchOS和macOS等平台开发应用的主要编程语言。本教程将详细介绍如何...

    ios开发 AES-128-ECB加密

    之前遇到的需求,ios上没有类似的实现。搞了好久在网上搜了很多资料都不能解决最后找到了一个c/c++的底层源码,才实现了最后整理了下上传了。是个ios的demo很详细你定能看懂的。运行在xcode环境下,关键算法的文件是...

    iOS开发之路--微博骨架搭建

    在iOS开发中,构建一个类似微博的应用涉及到许多关键知识点,包括UI设计、导航控制器的使用、数据模型的处理以及事件响应等。以下是对标题“iOS开发之路--微博骨架搭建”和描述的详细解读: 首先,iOS应用的界面...

    iOS开发进阶-完整版

    根据提供的信息,我们可以推断出这是一本关于iOS开发进阶的书籍,作者为唐巧。虽然提供的部分内容似乎并不是实际的章节内容,但从标题、描述和标签中,我们可以推测本书可能涵盖的一些关键知识点。 ### iOS开发进阶...

    IOS应用源码Demo-伸缩导航按钮-毕设学习.zip

    在iOS应用开发中,"伸缩导航按钮"是一种常见的交互设计模式,特别是在各种App的导航栏(NavigationBar)中。此项目“IOS应用源码Demo-伸缩导航按钮-毕设学习.zip”提供了一个实例,帮助开发者理解并实现这种功能。在...

    IOS源码应用Demo-Navigation(导航控制器).zip

    在iOS开发中,Navigation Controller(导航控制器)是苹果提供的一个核心组件,用于管理多个视图控制器的堆栈式导航。这个“IOS源码应用Demo-Navigation(导航控制器).zip”文件应该包含了一个完整的示例项目,展示...

    ios-自定义导航栏.zip

    本项目“ios-自定义导航栏.zip”提供了一个广泛使用的自定义导航栏实现,旨在帮助开发者根据项目需求创建个性化、功能丰富的导航体验。 在原生的iOS开发中,苹果提供了UINavigationController来管理一个或多个...

    IOS应用源码Demo-很炫的抽屉式侧边栏导航效果-毕设学习.zip

    在iOS应用开发中,抽屉式侧边栏导航(Drawer Navigation)是一种常见的设计模式,它为用户提供了方便的二级或三级菜单访问。这种效果通常在主屏幕内容下方滑动出一个侧面菜单,允许用户在不离开当前视图的情况下进行...

    IOS源码应用Demo-UISegmentedControl 的 导航式风格.zip

    【iOS 源码应用Demo-UISegmentedControl的导航式风格】 在iOS开发中,UISegmentedControl是一个常见的UI组件,它允许用户在多个相互排斥的选项之间进行选择。这个源码Demo主要展示了如何将UISegmentedControl与导航...

    IOS应用源码Demo-国内网站分类导航 WebsiteNavigation-毕设学习.zip

    【标题】"IOS应用源码Demo-国内网站分类导航 WebsiteNavigation-毕设学习.zip" 提供的是一款基于iOS平台的应用程序源代码,主要用于毕业设计学习。这个项目名为"WebsiteNavigation",显然它是一个网站分类导航的应用...

    IOS应用源码Demo-侧边伸缩导航栏效果-毕设学习.zip

    此压缩包"IOS应用源码Demo-侧边伸缩导航栏效果-毕设学习.zip"包含了实现这种效果的源代码,非常适合iOS开发初学者,特别是那些正在进行毕业设计或论文研究的学生来学习。 侧边伸缩导航栏通常被称为抽屉式导航或滑动...

    iOS实例开发源码——iliu-ios-cocos2d-viking-cba07f8.zip

    《iOS实例开发源码——iliu-ios-cocos2d-viking-cba07f8》 这个压缩包文件“iliu-ios-cocos2d-viking-cba07f8.zip”显然包含了iOS平台上一个基于Cocos2D的游戏或应用的源代码。Cocos2D是一个广泛使用的2D游戏开发...

    ios-iOS自定义横线导航-适配iPad.zip

    在iOS中,我们可以使用系统的`UINavigationController`和`UITabBarController`来实现导航功能,但这些默认组件可能无法满足所有设计需求,尤其是当需要独特设计或者iPad的特殊布局时。因此,开发者往往会选择自定义...

    ios-tabbar--上下滑动控件tabbar和导航栏隐藏.zip

    总之,“ios-tabbar--上下滑动控件tabbar和导航栏隐藏.zip”项目涵盖了iOS开发中的关键知识点,包括TabBar和NavigationBar的动态隐藏与显示,以及如何通过监听ScrollView的滚动事件来实现这些功能。开发者可以在这个...

    iOS 仿抖音 Object-C

    《iOS 仿抖音 Object-C》是一个基于Objective-C语言编写的抖音仿制项目,旨在通过手写简化版Spring框架的方式,帮助读者深入了解iOS开发中关键原理。通过摘取整体框架中的核心逻辑,并简化代码实现过程,保留核心...

    基于object-c实现人脸识别活体检测眨眼检测ios源码.zip

    基于object-c实现人脸识别活体检测眨眼检测ios源码.zip基于object-c实现人脸识别活体检测眨眼检测ios源码.zip基于object-c实现人脸识别活体检测眨眼检测ios源码.zip基于object-c实现人脸识别活体检测眨眼检测ios源码...

    IOS开发源码-布局控件使用自定义UITableViewCell 导航及底部菜单后台获取功能等ISO代码合集.zip

    IOS开发源码-布局控件使用自定义UITableViewCell 导航及底部菜单后台获取功能等ISO代码合集: ios三级展开列表TQMultistageTableView_10802 ios个性化每个tableMHNibTableViewCell ios分页的滚动视图 IOS可扩展底部...

    ios-地图导航.zip

    在iOS平台上,地图导航是移动应用开发中的一个重要领域,它为用户提供实时的位置信息、路线规划以及导航服务。本文将深入探讨iOS地图导航相关的知识点,包括基础概念、主要功能、技术实现以及常用API。 1. 基础概念...

Global site tag (gtag.js) - Google Analytics