博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现一种书本的展示特效
阅读量:6582 次
发布时间:2019-06-24

本文共 7020 字,大约阅读时间需要 23 分钟。

hot3.png

最近在做一个电子书的项目,其中有一个书架的功能。看了很多其他应用的书架,有些实现的效果真的很不错,就比如《宝宝爱看书》,于是也仿着自己写了一个,虽然最后没能用在项目中,但是还是觉得很不错,在这里和大家分享一下怎么实现的。

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

 

[cpp]
  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  
[cpp]
  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. @end  
[cpp]
  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  
[cpp]
  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的下载地址:

转载于:https://my.oschina.net/jackyyang/blog/67370

你可能感兴趣的文章
openldap安装
查看>>
[leetcode]count and say
查看>>
润乾报表 - 缓存问题
查看>>
利用IFormattable接口自动参数化Sql语句
查看>>
泛型Dictionary的用法详解
查看>>
明晰三种常见存储技术:DAS、SAN和NAS
查看>>
ContentProvider简单介绍
查看>>
Visual Studio 2014 CTPs 下载 和C# 6.0 语言预览版介绍
查看>>
js混淆 反混淆 在线
查看>>
python中的Iterable, Iterator,生成器概念
查看>>
WinForm 之 程序启动不显示主窗体
查看>>
【Network】Calico, Flannel, Weave and Docker Overlay Network 各种网络模型之间的区别
查看>>
【转】Oracle索引的类型
查看>>
FragmentTransaction.replace() 你不知道的坑
查看>>
分布式消息队列 Kafka
查看>>
模拟退火算法
查看>>
Solr 按照得分score跟指定字段相乘排序
查看>>
MySQL数据库如何去掉数据库中重复记录
查看>>
【原创】如何写一篇“用户友好”的随笔
查看>>
【16】成对使用new和delete时要采取相同形式
查看>>