文档章节

实现一种书本的展示特效

jackyyang
 jackyyang
发布于 2012/07/16 16:09
字数 868
阅读 101
收藏 0
最近在做一个电子书的项目,其中有一个书架的功能。看了很多其他应用的书架,有些实现的效果真的很不错,就比如《宝宝爱看书》,于是也仿着自己写了一个,虽然最后没能用在项目中,但是还是觉得很不错,在这里和大家分享一下怎么实现的。

  一开始以列表的方式显示向上或者向下滑动,切换布局方式,位置的信息记录在plist中点击其中任意一本书,选中的书本移动到最前面,只有在最前面的书本是可以直接打开的。

 

  1. //  
  2. //  UIBook.h  
  3. //  BookShelf  
  4. //  
  5. //  Created by zhouhaifeng  on 12-6-1.  
  6. //  Copyright (c) 2012年 zhouhaifeng. All rights reserved.  
  7. //  
  8.   
  9. #import <UIKit/UIKit.h>  
  10.   
  11.   
  12.   
  13.   
  14. @interface UIBook : UIButton  
  15. {  
  16.      id  bookdelegate;  
  17.     int downPrecent;  
  18.     UILabel *precent;  
  19. }  
  20.   
  21. @property (nonatomic) UILabel *precent;  
  22. @property (nonatomic) id bookdelegate;  
  23.   
  24. -(void) setDownloadPrecent:(int) value;  
  25. -(void) OnButtonClicked:(id)sender;  
  26. @end  
  27.   
  28.   
  29. @protocol UIBookDelegate <NSObject>  
  30. @optional  
  31. - (void)UIBook:(UIBook *)book clickedButtonAtIndex:(NSInteger)buttonIndex;  
  32. @end  

  1. //  
  2. //  UIBook.m  
  3. //  BookShelf  
  4. //  
  5. //  Created by zhouhaifeng on 12-6-1.  
  6. //  Copyright (c) 2012年 zhouhaifeng. All rights reserved.  
  7. //  
  8.   
  9. #import "UIBook.h"  
  10.   
  11. @implementation UIBook  
  12. @synthesize precent,bookdelegate;  
  13.   
  14. - (id)initWithFrame:(CGRect)frame  
  15. {  
  16.     self = [super initWithFrame:frame];  
  17.     if (self) {  
  18.         downPrecent = 100;  
  19.         // Initialization code  
  20.         [self setImage:[UIImage imageNamed:@"bookcover_temp.jpg"] forState:UIControlStateNormal];  
  21.           
  22.         UIImageView* progressbg = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"loading_bg.png"]];  
  23.         [progressbg setFrame:CGRectMake(100, 200, 96, 96)];  
  24.         [self addSubview:progressbg];  
  25.           
  26.         UIImageView* loading_ring = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"loading_ring.png"]];  
  27.         [loading_ring setFrame:CGRectMake(0, 0, 96, 96)];  
  28.         [progressbg addSubview:loading_ring];  
  29.           
  30.         [UIView animateWithDuration:2.0f delay:0.0f options:UIViewAnimationOptionRepeat|UIViewAnimationCurveLinear animations:^{  
  31.             loading_ring.transform = CGAffineTransformMakeRotation(M_PI);  
  32.         } completion:nil];  
  33.           
  34.         precent = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 96, 96)];  
  35.         [precent setText:[NSString stringWithFormat:@"%d%%",downPrecent]];  
  36.         [precent setTextColor:[UIColor whiteColor]];  
  37.         [precent setBackgroundColor:[UIColor clearColor]];  
  38.         [precent setTextAlignment:UITextAlignmentCenter];  
  39.         [progressbg addSubview:precent];  
  40.           
  41.         [self addTarget:self action:@selector(OnButtonClicked:) forControlEvents:UIControlEventTouchUpInside];  
  42.     }  
  43.     return self;  
  44. }  
  45.   
  46. -(void) OnButtonClicked:(id)sender  
  47. {  
  48.     if (bookdelegate) {  
  49.         if ([bookdelegate respondsToSelector:@selector(UIBook:clickedButtonAtIndex:)])  
  50.         {  
  51.             [bookdelegate UIBook:self clickedButtonAtIndex:self.tag];  
  52.         }  
  53.     }else {  
  54.         NSLog(@"these is no delegate");  
  55.     }  
  56. }  
  57.   
  58. -(void) setDownloadPrecent:(int) value  
  59. {  
  60.      downPrecent = value;  
  61.     [precent setText:[NSString stringWithFormat:@"%d%%",downPrecent]];  
  62.           
  63. }  
  64.   
  65.   
  66.   
  67. /* 
  68. // Only override drawRect: if you perform custom drawing. 
  69. // An empty implementation adversely affects performance during animation. 
  70. - (void)drawRect:(CGRect)rect 
  71. { 
  72.     // Drawing code 
  73. } 
  74. */  
  75.   
  76. @end  

  1. //  
  2. //  ViewController.h  
  3. //  BookShelf  
  4. //  
  5. //  Created by zhouhaifeng on 12-6-1.  
  6. //  Copyright (c) 2012年 zhouhaifeng. All rights reserved.  
  7. //  
  8.   
  9. #import <UIKit/UIKit.h>  
  10. #import <QuartzCore/QuartzCore.h>  
  11. #import "UIBook.h"  
  12.   
  13. typedef enum   
  14. {  
  15.     LayoutStateLine = 0,  
  16.     LayoutStateRandom  
  17. }LayoutState;  
  18.   
  19. @interface ViewController : UIViewController<UIGestureRecognizerDelegate,UIBookDelegate>  
  20. {     
  21.     NSMutableArray *bookArray;  
  22.     LayoutState layoutState;  
  23. }  
  24.   
  25.   
  26. -(void) swapBooks:(NSInteger) bookA  TwoBooks:(NSInteger) bookB;  
  27. @property (nonatomic) NSMutableArray *bookArray;  
  28. @end  

  1. //  
  2. //  ViewController.m  
  3. //  BookShelf  
  4. //  
  5. //  Created by zhouhaifeng on 12-6-1.  
  6. //  Copyright (c) 2012年 zhouhaifeng. All rights reserved.  
  7. //  
  8. #define NUMBER 8  
  9.   
  10. #import "ViewController.h"  
  11.   
  12. @interface ViewController ()  
  13. -(void) didSwipe:(UISwipeGestureRecognizer *) recognizer;  
  14. -(void) layoutBooks;  
  15. @end  
  16.   
  17. @implementation ViewController  
  18. @synthesize bookArray;  
  19.   
  20. - (void)viewDidLoad  
  21. {  
  22.     [super viewDidLoad];  
  23.     [self.view setUserInteractionEnabled:YES];  
  24.     bookArray = [NSMutableArray arrayWithCapacity:10];  
  25.     layoutState = LayoutStateLine;  
  26.   //添加书本  
  27.     for (int i = 0; i<NUMBER; i++)   
  28.     {  
  29.         UIBook *book =  [UIBook buttonWithType:UIButtonTypeCustom];  
  30.         [book setBookdelegate:self];  
  31.         [self.view addSubview:book];  
  32.         [bookArray addObject:book];  
  33.         [book setDownloadPrecent:i*10];  
  34.         book.layer.shadowOffset = CGSizeMake(1,3);  
  35.         book.layer.shadowColor = [UIColor blackColor].CGColor;  
  36.         book.layer.shadowOpacity = 1.0f;  
  37.     }  
  38.     [self layoutBooks];  
  39.   //添加手势  
  40.     UISwipeGestureRecognizer *pinTouches = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(didSwipe:)];  
  41.     pinTouches.direction= UISwipeGestureRecognizerDirectionUp|UISwipeGestureRecognizerDirectionDown;  
  42.     [self.view addGestureRecognizer:pinTouches];      
  43.   
  44. }  
  45.   
  46. -(void) didSwipe:(UISwipeGestureRecognizer *) recognizer;  
  47. {  
  48.    if (recognizer.state == UIGestureRecognizerStateEnded) {  
  49.         if (layoutState == LayoutStateLine) {  
  50.                 layoutState = LayoutStateRandom;  
  51.                 NSLog(@"layoutState----------LayoutStateLine:%d",layoutState);  
  52.                 [self layoutBooks];  
  53.         }else if (layoutState == LayoutStateRandom){  
  54.                 layoutState = LayoutStateLine;  
  55.                 NSLog(@"layoutState---------LayoutStateRandom:%d",layoutState);  
  56.                 [self layoutBooks];  
  57.         }  
  58.     }  
  59. }  
  60.   
  61. -(void) layoutBooks  
  62. {  
  63.      
  64.     if (layoutState == LayoutStateRandom) {  
  65.         NSString *imagePath= [[NSBundle mainBundle] pathForResource:@"bookshelf" ofType:@"plist"];  
  66.         NSArray *imageDiction= [NSArray arrayWithContentsOfFile:imagePath];  
  67.         NSArray *dataFromPlist=[NSArray arrayWithArray:[imageDiction objectAtIndex:NUMBER-1]];  
  68.         for (int j=0; j<dataFromPlist.count; j++) {  
  69.             NSDictionary *bookdata=[NSDictionary dictionaryWithDictionary:[dataFromPlist objectAtIndex:j]];  
  70.            
  71.             UIBook *book = [bookArray objectAtIndex:j];  
  72.             [book setTag:j];  
  73.             NSString *str = [bookdata objectForKey:@"center"];  
  74.             CGPoint centerPoint = CGPointFromString(str);  
  75.             CGFloat angle = [[bookdata objectForKey:@"angle"]floatValue];  
  76.            // CGFloat scale = [[bookdata objectForKey:@"scale"]floatValue];  
  77.             [UIView animateWithDuration:0.5 animations:^{  
  78.                 [book setCenter:centerPoint];  
  79.                 [book setTransform:CGAffineTransformMakeRotation(angle/180*M_PI)];  
  80.                 [self.view sendSubviewToBack:book];  
  81.                 //[book setTransform:CGAffineTransformMakeScale(scale, scale)];  
  82.             }];  
  83.         }  
  84.     }else  if (layoutState == LayoutStateLine) {  
  85.         for (int j=0; j<NUMBER; j++)  
  86.         {  
  87.             [UIView animateWithDuration:0.5 animations:^{  
  88.                 UIBook *book = [bookArray objectAtIndex:j];  
  89.                 [book setTag:j];  
  90.                 [book setTransform:CGAffineTransformMakeRotation(0)];  
  91.                 [book setFrame:CGRectMake(40+250*(j%4), 30+350*(j/4), 200, 300)];  
  92.                 [self.view sendSubviewToBack:book];  
  93.             }];  
  94.         }  
  95.     }  
  96.       
  97. }  
  98.   
  99. -(void) swapBooks:(NSInteger) bookA TwoBooks:(NSInteger)bookB  
  100. {  
  101.     for (int n=0; n<bookA-bookB;n++) {  
  102.         UIBook *first =  [bookArray objectAtIndex:0];  
  103.         for(int i=0; i<NUMBER-1; i++) {  
  104.             UIBook *book2 = [bookArray objectAtIndex:i+1];  
  105.             [bookArray replaceObjectAtIndex:i withObject:book2];  
  106.         }  
  107.         [bookArray replaceObjectAtIndex:(NUMBER-1) withObject:first];  
  108.           
  109.     }  
  110.     [self layoutBooks];  
  111.   
  112. }  
  113.      
  114.   
  115. - (void)UIBook:(UIBook *)book clickedButtonAtIndex:(NSInteger)buttonIndex  
  116. {  
  117.     if (buttonIndex!=0) {  
  118.           [self swapBooks:buttonIndex TwoBooks:0];  
  119.     }else {  
  120.         NSLog(@"Open the books");  
  121.     }  
  122.         
  123. }  
  124.   
  125. - (void)viewDidUnload  
  126. {  
  127.     [super viewDidUnload];  
  128.     // Release any retained subviews of the main view.  
  129. }  
  130.   
  131. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
  132. {  
  133.     return YES;  
  134. }  
  135.   
  136. @end  

Demo的下载地址:http://download.csdn.net/detail/toss156/4350495

本文转载自:http://blog.csdn.net/toss156/article/details/7630518

共有 人打赏支持
jackyyang
粉丝 22
博文 42
码字总数 18506
作品 0
珠海
私信 提问
6 个迷人而令人惊叹的 HTML5 动画特效

HTML5正在快速的进入WEB世界,它在给浏览器各种压力的同时,也带给了我们很多之前意想不到的网页效果,如果我们在网页上能适当的使用一些HTML5元素,可能会给网站带来不一样的用户体验。但是...

yykj
2012/11/15
20.6K
16
【IOS】实现一种书本的展示特效

【原创作品, 欢迎转载,转载请在明显处注明! 谢谢。 原文地址:http://blog.csdn.net/toss156/article/details/7630518】 最近在做一个电子书的项目,其中有一个书架的功能。看了很多其他应...

toss156
2012/06/04
0
0
6个迷人而令人惊叹的HTML 5动画特效

【IT168 技术】HTML5正在快速的进入WEB世界,它在给浏览器各种压力的同时,也带给了我们很多之前意想不到的网页效果,如果我们在网页上能适当的使用一些 HTML5元素,可能会给网站带来不一样的...

开源中国社区
2012/11/16
0
0
8款炫酷的HTML5特效源码

HTML5的强大不仅在于可以让网页元素更加灵活多变,更在于它可以很方便的实现网页动画的特效,可以让你的网站更加富有现代化特色。今天,就给大家分享8个让人难忘的HTML5炫酷动画~ 1、HTML5 C...

牵着蜗牛去西藏
2015/02/09
4K
1
6 个实现翻书效果的 jQuery 插件

jQuery的与现代网络技术相结合,可以创造奇迹,它可以用来实现大多数的逼真的效果。在大部分时间中,来自现实世界的例子影响着Web开发人员的灵感。而像书一样翻页效果是一种非常流行的Web开发...

oschina
2012/10/04
45.7K
5

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot引入第三方jar包或本地jar包的处理方式

在开发过程中有时会用到maven仓库里没有的jar包或者本地的jar包,这时没办法通过pom直接引入,那么该怎么解决呢 一般有两种方法 - 第一种是将本地jar包安装在本地maven库 - 第二种是将本地j...

独钓渔
46分钟前
2
0
五、MyBatis缓存

一、MyBatis缓存介绍 缓存的使用可以明显的加快访问数据速度,提升程序处理性能,生活和工作中,使用缓存的地方很多。在开发过程中,从前端-->后端-->数据库等都涉及到缓存。MyBatis作为数据...

yangjianzhou
今天
2
0
最近研究如何加速UI界面开发,有点感觉了

最近在开发JFinal学院的JBolt开发平台,后端没啥说的,做各种极简使用的封装,开发者上手直接使用。 JBolt开发平台包含常用的用户、角色、权限、字典、全局配置、缓存、增删改查完整模块、电...

山东-小木
今天
3
0
《月亮与六便士》的读后感作文3000字

《月亮与六便士》的读后感作文3000字: 看完英国作家威廉.萨默塞特.毛姆所著《月亮与六便士》(李继宏译),第一疑问就是全书即没提到“月亮”,也没提到“六便士”。那这书名又与内容有什么...

原创小博客
昨天
2
0
微信网页授权获取用户信息(ThinkPHP5)+ 微信发送客服消息(一)

以thinkphp5为实例,创建控制器 class Kf extends Controller { /** * [protected description]微信公众号appid * @var [type] */ protected $appid = "xxxxxxxxxxxxxxx"; /** * [protected......

半缘修道半缘君丶
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部