iPhone SDK开发基础之UIPageControl编程
iPhone SDK开发基础之UIPageControl编程
当用户界面需要按页面进行显示时,使用iOS提供的UIPageControl控件将要显示的用户界面内容分页进行显示会使编程工作变得非常快捷,如图3-47所示就是一个使用UIPageControl控件逐页进行图片显示的程序,用户按下屏幕即可进行左右滚动显示,在屏幕的正上方使用白色的点显示当前滚动到的页面位置。
程序自定义一个SwipeView类,该类通过子类化UIView类并重载其touchesMoved()方法捕获用户滚动的方向,类的定义如下。
// SwipeView.h
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
@interface SwipeView : UIView {
CGPoint startTouchPosition;
NSString *dirString;
UIViewController *host;
}
- (void) setHost: (UIViewController *) aHost;
@end
// SwipeView.m
#import "SwipeView.h"
@implementation SwipeView
- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
// Initialization code
}
return self;
}
- (void) setHost: (UIViewController *) aHost
{
host = aHost;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
startTouchPosition = [touch locationInView:self];
dirString = NULL;
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = touches.anyObject;
CGPoint currentTouchPosition = [touch locationInView:self];
#define HORIZ_SWIPE_DRAG_MIN 12
#define VERT_SWIPE_DRAG_MAX 4
if (fabsf(startTouchPosition.x - currentTouchPosition.x) >=
HORIZ_SWIPE_DRAG_MIN &&
fabsf(startTouchPosition.y - currentTouchPosition.y) <=
VERT_SWIPE_DRAG_MAX) {
// Horizontal Swipe
if (startTouchPosition.x < currentTouchPosition.x) {
dirString = kCATransitionFromLeft;
}
else
dirString = kCATransitionFromRight;
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
if (dirString) [host swipeTo:dirString];
}
@end
在捕获用户滚动的方向后,SwipeView类通过用户设置的host成员变量回调其swipeTo()方法,host成员变量在类中定义为UIViewController,在编译时编译器会产生警告,这里不用管它,只需要SwipeView类的使用者设置host成员变量并实现swipeTo()方法即可。
SwipeView类的使用者为PageViewController类,该类实现程序的主界面,在这个自定义的UIViewController类中实现swipeTo()方法,代码如下。
// PageViewController.m
- (void) swipeTo: (NSString *) aDirection{
UIPageControl *pageControl = [[[contentView superview] subviews] lastObject];
if ([aDirection isEqualToString:kCATransitionFromRight])
{
if (currentPage == 5) return;
[pageControl setCurrentPage:currentPage + 1];
} else {
if (currentPage == 0) return;
[pageControl setCurrentPage:currentPage - 1];
}
[self pageTurn:pageControl];
}
在该回调方法中根据用户滚动的方向来设置UIPageControl的currentPage属性,如果是向右方滚动则页面计数加一,如果用户滚动的方向是向左,则页面计数减一。设置UIPageControl的currentPage属性以后,PageViewController对象再调用其pageTurn()方法交换页面显示内容,并将图片显示出来,代码如下。
- (void) pageTurn: (UIPageControl *) pageControl{
CATransition *transition;
int secondPage = [pageControl currentPage];
if ((secondPage - currentPage) > 0)
transition = [self getAnimation:@"fromRight"];
else
transition = [self getAnimation:@"fromLeft"];
UIImageView *newView = (UIImageView *)[[contentView subviews] objectAtIndex:0];
[newView setImage:[UIImage imageNamed:[NSString stringWithFormat:@"ipad_ wallpaper%02d.jpg", secondPage + 1]]];
[contentView exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
[[contentView layer] addAnimation:transition forKey:@"transitionView Animation"];
currentPage = [pageControl currentPage];
}
在主pageTurn()方法实现中,PageViewController类通过UIView的exchangeSubview AtIndex()方法实现页面内容的切换。
本节相关的完整Xcode工程源代码文件请参考本书附带的光盘中的PageControl工程。
本文节选自《iOS软件开发揭密:iPhone&iPad企业应用和游戏开发》Q一书。
《iOS软件开发揭密:iPhone&iPad企业应用和游戏开发》一书已由电子工业出版社正式出版,本书由虞斌著。
购买地址:
当当网:
http://product.dangdang.com/product.aspx?product_id=21082051
卓越网:
http://www.amazon.cn/iOS%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E6%8F%AD%E5%AF%86-iPhone-iPad%E4%BC%81%E4%B8%9A%E5%BA%94%E7%94%A8%E5%92%8C%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91-%E8%99%9E%E6%96%8C/dp/B0051HAIA4/ref=sr_1_1?s=books&ie=UTF8&qid=1306139777&sr=1-1
iPhone SDK开发基础之UIPageControl编程相关推荐
- iPhone SDK开发基础之iPhone程序框架
总的来说iPhone程序有两类框架,一类是游戏框架,另一类是非游戏框架,这里介绍的是非游戏框架,即基于iPhone 用户界面标准控件的程序框架. 典型的iPhone程序包含一个Window和几个UIV ...
- iPhone SDK开发:改变UISWitch文本和颜色(当初好像我没明白,现在也没明白)
iPhone SDK中的Switch控件默认的文本为 ON OFF两种,不同的语言显示不同, 颜色均为蓝色和亮灰色,如图 如果想改变ON,OFF文本,我们必须重从UISwitch继承一个新类, 然后在 ...
- 基于Unity3D 的Vuforia SDK开发基础教程
前言 增强现实技术是当前信息技术领域的一项重要的综合性技术,融合了模式识别.计算机图形学等多个学科的知识.今天我们就和大家一起来看一下,这个技术到底可以带给我们什么吧. 左边是通过手机观看图片,可 ...
- Bytom移动端钱包SDK开发基础
比原项目仓库: Github地址:github.com/Bytom/bytom Gitee地址:gitee.com/BytomBlockc- Bytom-Mobile-Wallet-SDK 是从byt ...
- 18-ESP8266 SDK开发基础入门篇--TCP 服务器 RTOS版,串口透传,TCP客户端控制LED
https://www.cnblogs.com/yangfengwu/p/11112015.html 先规定一下协议 aa 55 02 01 F1 4C 控制LED点亮 F1 4C为CRC高位和低位 ...
- python类和对象介绍_Python开发基础-Day17面向对象编程介绍、类和对象
面向对象变成介绍 面向过程编程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西.主要应用在一旦完成很少修改的地方,如linux ...
- 3-ESP8266 SDK开发基础入门篇--点亮一个灯
https://www.cnblogs.com/yangfengwu/p/11072834.html 所有的源码 https://gitee.com/yang456/Learn8266SDKDevel ...
- 20-ESP8266 SDK开发基础入门篇--C# TCP客户端编写 , 加入数据通信
https://www.cnblogs.com/yangfengwu/p/11192594.html 自行调整页面 连接上以后主动发个数据 namespace TCPClient {public pa ...
- 10-ESP8266 SDK开发基础入门篇--上位机通过串口控制ESP8266灯亮灭
https://www.cnblogs.com/yangfengwu/p/11087618.html 其实这一节就是对上三节的综合测试 https://www.cnblogs.com/yangfeng ...
- iOS iPhone SDK 包含哪些东西?
From: http://www.cnblogs.com/jy578154186/archive/2013/02/27/2934881.html iPhone SDK 包含哪些东西? 第一部分: 在使 ...
最新文章
- 北理工硕士被指抄袭投稿论文,校方通报:留校察看
- solaris vi 方向键问题
- mysql十万条数据_2秒内向数据库中插入十万条数据?
- ASP.NET 使用Ajax
- [转载] Python 统计学习方法——kdTree实现K近邻搜索
- while 循环java_Java做while循环
- Best Practices for Speeding Up Your Web Site(4)
- python模拟登录的实现
- 计算机视觉三大国际会议ICCV、ECCV、CVPR
- python图片查看器
- photoshop之合并图层
- 殇城的伤感心情日志分享:青春容颜,我却一笔流伤
- Android:在PC屏幕上显示Android手机屏幕
- openscad螺栓数据生成2
- 博实结将在创业板上会:计划募资25亿元,周小强为实际控制人
- 33MW太阳能厂动工 日本福岛开启复兴之路
- 基于web的计算机配件销售系统,javaweb电脑配件销售管理系统
- 【设cache的容量为214块,每块是一个32位字,主存容量是cache容量的256倍,其中有如表4.11所示数据(地址和数据均采用十六进制表示)】
- 上证50基金有哪些_上证50指数基金哪个好?怎么选?
- 新能源汽车产业深度研究报告:从2.0迈入3.0时代(113页)