`
beike
  • 浏览: 357008 次
社区版块
存档分类
最新评论

编写简单的翻页效果

阅读更多

 

http://marshal.easymorse.com/archives/3760

 

页效果,类似下面的样子:

imageimage

在电子书应用中会很常见。这里需要两个要点:在电子书应用中会很常见。这里需要两个要点:

  • 翻页动画
  • 手势上下轻扫(swipe)的处理

 

先说一下轻扫(swipe)的实现,可以参考编写简单的手势示例:Tap了解手势种类。

在viewDidLoad方法中注册了对上、下、左、右四个方向轻松的处理方法:

- (void)viewDidLoad { 
    
    UISwipeGestureRecognizer *recognizer; 
    
    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; 
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)]; 
    [[self view] addGestureRecognizer:recognizer]; 
    [recognizer release]; 
    
    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; 
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionUp)]; 
    [[self view] addGestureRecognizer:recognizer]; 
    [recognizer release]; 
    
    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; 
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionDown)];
    [[self view] addGestureRecognizer:recognizer]; 
    [recognizer release]; 
    
    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; 
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)]; 
    [[self view] addGestureRecognizer:recognizer]; 
    [recognizer release]; 
    
    
    [super viewDidLoad];

 

可以看到,都是同一个方法,handleSwipeFrom。

在该方法中,再识别具体是哪个方向的轻扫手势,比如判断是向下的轻扫:

-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer { 
    NSLog(@"Swipe received."); 
    
    if (recognizer.direction==UISwipeGestureRecognizerDirectionDown) { 
        NSLog(@"swipe down");

判断是向上的轻扫:

if (recognizer.direction==UISwipeGestureRecognizerDirectionUp) { 
    NSLog(@"swipe up");

有关动画的处理,比如向下(往回)翻页,类似这样:

[UIView beginAnimations:@"animationID" context:nil]; 
[UIView setAnimationDuration:0.7f]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationRepeatAutoreverses:NO]; 
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES];

[currentView removeFromSuperview]; 
[self.view addSubview:contentView];

[UIView commitAnimations];

向上(向前)翻页,只需改为:

[UIView beginAnimations:@"animationID" context:nil]; 
[UIView setAnimationDuration:0.7f]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationRepeatAutoreverses:NO]; 
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUpforView:self.view cache:YES];

[currentView removeFromSuperview]; 
[self.view addSubview:contentView];

[UIView commitAnimations];

如果是电子书,还需要考虑一个问题,就是有多个页面(图形),比如50页。那么需要有一个数据结构来保存这些页面的图片路径:

  • objc数据结构,比如数组
  • sqlite数据库表

这样,写一套翻页代码和加载什么图形之间就可以解耦。

本文示例使用的是数组,类似这样:

pages=[[NSArray alloc] initWithObjects:@"1.jpg",@"2.jpg",@"3.jpg",@"4.jpg",@"5.jpg",@"6.jpg",
                 nil];

图片保存在resources下。

为了能让上页下页翻页的时候找到关联的页面,采用了如下机制:

  • 将图片封装为UIImageView显示
  • 可以为UIImageView设置一个tag值,值为数组下标+1
  • 这样,上级view有方法能根据tag查询到UIImageView,比如:UIView *currentView=[self.view viewWithTag:currentTag];
  • 设置一个成员变量currentTag保存当前的tag值

比如这样,当应用加载的时候显示第一页:

    currentTag=1; 
    
    NSString *path = [[NSBundle mainBundle] pathForResource:@"pageflip1" ofType:@"mp3"]; 
    player=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; 
    
    //[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO]; 
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation: UIStatusBarAnimationSlide]; 
    UIImageView *contentView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];  
    [contentView setImage:[UIImage imageNamed:[pages objectAtIndex:(currentTag-1)]]];  
    [contentView setUserInteractionEnabled:YES]; 
    contentView.tag=currentTag;

在翻页时的处理:

if (currentTag<[pages count]) { 
    UIView *currentView=[self.view viewWithTag:currentTag]; 
    currentTag++; 
    
    UIImageView *contentView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
    [contentView setImage:[UIImage imageNamed:[pages objectAtIndex:(currentTag-1)]]];  
    [contentView setUserInteractionEnabled:YES]; 
    contentView.tag=currentTag; 
    
    [UIView beginAnimations:@"animationID" context:nil]; 
    [UIView setAnimationDuration:0.7f]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationRepeatAutoreverses:NO]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES]; 
    
    [currentView removeFromSuperview]; 
    [self.view addSubview:contentView]; 
    
    [UIView commitAnimations];

分享到:
评论

相关推荐

    Comic-Book-Page-Turning-Effect:一部使用HTML,CSS和Javascript制作并具有翻页效果的网络漫画书

    漫画书翻页效果是一种使用HTML,CSS和Javascript构建的网络漫画,用于可视化具有翻页效果的真实图书的效果 项目目标 学习如何制作网络书 以简单统一的方式教学生更难的概念 技术: •前端:JavaScript,引导程序,...

    微信小程序swiper组件实现抖音翻页切换视频功能的实例代码

    利用swiper组件可简单快速编写仿抖音短视频的功能 自动播放当前页视频 翻页停止播放当前页视频 并自动播放下页视频 有其他需求也可用 cover-view 添加 收藏 点赞 评论等功能 效果图: video官方介绍: ...

    react-pageflip:用于StPageFlip库的简单React.js包装器,用于创建逼真的美观的页面翻转效果

    用于StPageFlip库的简单React.js包装器,用于创建逼真的美观的页面翻转效果 StPageFlip的功能 适用于画布上的简单图像和复杂HTML块 具有简单的API和灵活的配置 兼容移动设备 支持横向和纵向屏幕模式 支持软页和硬页...

    C++Builder精彩编程实例集锦的源代码前3部分.rar

    实例139 如何实现图像翻页效果 实例140 如何实现图像镜像效果 实例141 如何柔化处理图像 实例142 如何锐化处理图像 实例143 如何雾化处理图像 实例144 如何将彩色图像转换成黑白图像 实例145 如何将BMP图像...

    C++Builder精彩编程实例集锦的源代码后3部分.rar

    实例139 如何实现图像翻页效果 实例140 如何实现图像镜像效果 实例141 如何柔化处理图像 实例142 如何锐化处理图像 实例143 如何雾化处理图像 实例144 如何将彩色图像转换成黑白图像 实例145 如何将BMP图像...

    第一部分 界面设计

    实例139 如何实现图像翻页效果 实例140 如何实现图像镜像效果 实例141 如何柔化处理图像 实例142 如何锐化处理图像 实例143 如何雾化处理图像 实例144 如何将彩色图像转换成黑白图像 实例145 如何将BMP图像...

    JQuery&CSS;&CSS;+DIV实例大全.rar

    简单jQuery+CSS实现验证表单红色提示效果 16.简单表单input输入框提示插件1.0下载 17.另种效果的jQuery EasyValidator表单验证插件demo示例下载 18.漂亮绿色多级动感仿flash效果的jquery网站导航菜单 19....

    ExpoCMS展览行业网站系统 v2.0 build 20120126.rar

    采用较为成熟的ASP ACCESS编写、DIV CSS布局、jquery类库,access数据库架构,简单好用、易于部署、扩展,能满足展会基本的宣传展示、信息发布功能,同时系统开放全部源码,用户可以根据自己的需求扩展出自己需求的...

    asp.net知识库

    使用microsoft.web.ui.webcontrols的TabStrip与IFame组件,达到页的切换效果 HttpModule 实现 ASP.Net (*.aspx) 中文简繁体的自动转换,不用修改原有的任何代码,直接部署即可! 服务器自定义开发二之客户端脚本回发 Web...

    《OceanX》播放器 Prv0.3

    1,重新编写的内部核心代码程序 2,所有原先V2版的不足已经得到完全修正 3,拥有了更强大的列表处理能力,在已形成的列表中,使用者还可以进行再编辑!!4,最新加入了URL地址的直接输入功能5,最新放入了功能菜单的设计...

    《OceanX》播放器 Prv0.33

    1,重新编写的内部核心代码程序 2,所有原先V2版的不足已经得到完全修正 3,拥有了更强大的列表处理能力,在已形成的列表中,使用者还可以进行再编辑!!4,最新加入了URL地址的直接输入功能5,最新放入了功能菜单的设计...

    《OceanX》播放器 Prv0.34

    1,重新编写的内部核心代码程序 2,所有原先V2版的不足已经得到完全修正 3,拥有了更强大的列表处理能力,在已形成的列表中,使用者还可以进行再编辑!!4,最新加入了URL地址的直接输入功能5,最新放入了功能菜单的设计...

    《浩海网络多格式播放器》V3.9.4.1

    1,重新编写的内部核心代码程序 2,所有原先V2版的不足已经得到完全修正 3,拥有了更强大的列表处理能力,在已形成的列表中,使用者还可以进行再编辑!! 4,最新加入了URL地址的直接输入功能 5,最新放入了功能菜单的...

    《浩海网络多格式播放器》V3.9.4.4

    1,重新编写的内部核心代码程序 2,所有原先V2版的不足已经得到完全修正 3,拥有了更强大的列表处理能力,在已形成的列表中,使用者还可以进行再编辑!!4,最新加入了URL地址的直接输入功能5,最新放入了功能菜单的设计...

    《浩海网络多格式播放器》V3.9.4.5

    1,重新编写的内部核心代码程序 2,所有原先V2版的不足已经得到完全修正 3,拥有了更强大的列表处理能力,在已形成的列表中,使用者还可以进行再编辑!!4,最新加入了URL地址的直接输入功能5,最新放入了功能菜单的设计...

Global site tag (gtag.js) - Google Analytics