您的位置:首页 > 其它

实现一种书本的展示特效

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


一开始以列表的方式显示

向上或者向下滑动,切换布局方式,位置的信息记录在plist中

点击其中任意一本书,选中的书本移动到最前面,只有在最前面的书本是可以直接打开的。

[cpp]
view plain
copy

//

// UIBook.h

// BookShelf

//

// Created by zhouhaifeng on 12-6-1.

// Copyright (c) 2012年 zhouhaifeng. All rights reserved.

//

#import <UIKit/UIKit.h>

@interface UIBook : UIButton

{

id bookdelegate;

int downPrecent;

UILabel *precent;

}

@property (nonatomic) UILabel *precent;

@property (nonatomic) id bookdelegate;

-(void) setDownloadPrecent:(int) value;

-(void) OnButtonClicked:(id)sender;

@end

@protocol UIBookDelegate <NSObject>

@optional

- (void)UIBook:(UIBook *)book clickedButtonAtIndex:(NSInteger)buttonIndex;

@end

[cpp]
view plain
copy

//

// UIBook.m

// BookShelf

//

// Created by zhouhaifeng on 12-6-1.

// Copyright (c) 2012年 zhouhaifeng. All rights reserved.

//

#import "UIBook.h"

@implementation UIBook

@synthesize precent,bookdelegate;

- (id)initWithFrame:(CGRect)frame

{

self = [super initWithFrame:frame];

if (self) {

downPrecent = 100;

// Initialization code

[self setImage:[UIImage imageNamed:@"bookcover_temp.jpg"] forState:UIControlStateNormal];

UIImageView* progressbg = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"loading_bg.png"]];

[progressbg setFrame:CGRectMake(100, 200, 96, 96)];

[self addSubview:progressbg];

UIImageView* loading_ring = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"loading_ring.png"]];

[loading_ring setFrame:CGRectMake(0, 0, 96, 96)];

[progressbg addSubview:loading_ring];

[UIView animateWithDuration:2.0f delay:0.0f options:UIViewAnimationOptionRepeat|UIViewAnimationCurveLinear animations:^{

loading_ring.transform = CGAffineTransformMakeRotation(M_PI);

} completion:nil];

precent = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 96, 96)];

[precent setText:[NSString stringWithFormat:@"%d%%",downPrecent]];

[precent setTextColor:[UIColor whiteColor]];

[precent setBackgroundColor:[UIColor clearColor]];

[precent setTextAlignment:UITextAlignmentCenter];

[progressbg addSubview:precent];

[self addTarget:self action:@selector(OnButtonClicked:) forControlEvents:UIControlEventTouchUpInside];

}

return self;

}

-(void) OnButtonClicked:(id)sender

{

if (bookdelegate) {

if ([bookdelegate respondsToSelector:@selector(UIBook:clickedButtonAtIndex:)])

{

[bookdelegate UIBook:self clickedButtonAtIndex:self.tag];

}

}else {

NSLog(@"these is no delegate");

}

}

-(void) setDownloadPrecent:(int) value

{

downPrecent = value;

[precent setText:[NSString stringWithFormat:@"%d%%",downPrecent]];

}

/*

// Only override drawRect: if you perform custom drawing.

// An empty implementation adversely affects performance during animation.

- (void)drawRect:(CGRect)rect

{

// Drawing code

}

*/

@end

[cpp]
view plain
copy

//

// ViewController.h

// BookShelf

//

// Created by zhouhaifeng on 12-6-1.

// Copyright (c) 2012年 zhouhaifeng. All rights reserved.

//

#import <UIKit/UIKit.h>

#import <QuartzCore/QuartzCore.h>

#import "UIBook.h"

typedef enum

{

LayoutStateLine = 0,

LayoutStateRandom

}LayoutState;

@interface ViewController : UIViewController<UIGestureRecognizerDelegate,UIBookDelegate>

{

NSMutableArray *bookArray;

LayoutState layoutState;

}

-(void) swapBooks:(NSInteger) bookA TwoBooks:(NSInteger) bookB;

@property (nonatomic) NSMutableArray *bookArray;

@end

[cpp]
view plain
copy

//

// ViewController.m

// BookShelf

//

// Created by zhouhaifeng on 12-6-1.

// Copyright (c) 2012年 zhouhaifeng. All rights reserved.

//

#define NUMBER 8

#import "ViewController.h"

@interface ViewController ()

-(void) didSwipe:(UISwipeGestureRecognizer *) recognizer;

-(void) layoutBooks;

@end

@implementation ViewController

@synthesize bookArray;

- (void)viewDidLoad

{

[super viewDidLoad];

[self.view setUserInteractionEnabled:YES];

bookArray = [NSMutableArray arrayWithCapacity:10];

layoutState = LayoutStateLine;

//添加书本

for (int i = 0; i<NUMBER; i++)

{

UIBook *book = [UIBook buttonWithType:UIButtonTypeCustom];

[book setBookdelegate:self];

[self.view addSubview:book];

[bookArray addObject:book];

[book setDownloadPrecent:i*10];

book.layer.shadowOffset = CGSizeMake(1,3);

book.layer.shadowColor = [UIColor blackColor].CGColor;

book.layer.shadowOpacity = 1.0f;

}

[self layoutBooks];

//添加手势

UISwipeGestureRecognizer *pinTouches = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(didSwipe:)];

pinTouches.direction= UISwipeGestureRecognizerDirectionUp|UISwipeGestureRecognizerDirectionDown;

[self.view addGestureRecognizer:pinTouches];

}

-(void) didSwipe:(UISwipeGestureRecognizer *) recognizer;

{

if (recognizer.state == UIGestureRecognizerStateEnded) {

if (layoutState == LayoutStateLine) {

layoutState = LayoutStateRandom;

NSLog(@"layoutState----------LayoutStateLine:%d",layoutState);

[self layoutBooks];

}else if (layoutState == LayoutStateRandom){

layoutState = LayoutStateLine;

NSLog(@"layoutState---------LayoutStateRandom:%d",layoutState);

[self layoutBooks];

}

}

}

-(void) layoutBooks

{

if (layoutState == LayoutStateRandom) {

NSString *imagePath= [[NSBundle mainBundle] pathForResource:@"bookshelf" ofType:@"plist"];

NSArray *imageDiction= [NSArray arrayWithContentsOfFile:imagePath];

NSArray *dataFromPlist=[NSArray arrayWithArray:[imageDiction objectAtIndex:NUMBER-1]];

for (int j=0; j<dataFromPlist.count; j++) {

NSDictionary *bookdata=[NSDictionary dictionaryWithDictionary:[dataFromPlist objectAtIndex:j]];

UIBook *book = [bookArray objectAtIndex:j];

[book setTag:j];

NSString *str = [bookdata objectForKey:@"center"];

CGPoint centerPoint = CGPointFromString(str);

CGFloat angle = [[bookdata objectForKey:@"angle"]floatValue];

// CGFloat scale = [[bookdata objectForKey:@"scale"]floatValue];

[UIView animateWithDuration:0.5 animations:^{

[book setCenter:centerPoint];

[book setTransform:CGAffineTransformMakeRotation(angle/180*M_PI)];

[self.view sendSubviewToBack:book];

//[book setTransform:CGAffineTransformMakeScale(scale, scale)];

}];

}

}else if (layoutState == LayoutStateLine) {

for (int j=0; j<NUMBER; j++)

{

[UIView animateWithDuration:0.5 animations:^{

UIBook *book = [bookArray objectAtIndex:j];

[book setTag:j];

[book setTransform:CGAffineTransformMakeRotation(0)];

[book setFrame:CGRectMake(40+250*(j%4), 30+350*(j/4), 200, 300)];

[self.view sendSubviewToBack:book];

}];

}

}

}

-(void) swapBooks:(NSInteger) bookA TwoBooks:(NSInteger)bookB

{

for (int n=0; n<bookA-bookB;n++) {

UIBook *first = [bookArray objectAtIndex:0];

for(int i=0; i<NUMBER-1; i++) {

UIBook *book2 = [bookArray objectAtIndex:i+1];

[bookArray replaceObjectAtIndex:i withObject:book2];

}

[bookArray replaceObjectAtIndex:(NUMBER-1) withObject:first];

}

[self layoutBooks];

}

- (void)UIBook:(UIBook *)book clickedButtonAtIndex:(NSInteger)buttonIndex

{

if (buttonIndex!=0) {

[self swapBooks:buttonIndex TwoBooks:0];

}else {

NSLog(@"Open the books");

}

}

- (void)viewDidUnload

{

[super viewDidUnload];

// Release any retained subviews of the main view.

}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

{

return YES;

}

@end

Demo的下载地址:http://download.csdn.net/detail/toss156/4350495
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: