一、头文件
//
// NQScorllPage.h
// IpadBlackDemo
//
// Created by ch_soft on 11-11-17.
// Copyright 2011年 __MyCompanyName__. All rights reserved.
//
#import<UIKit/UIKit.h>
#import"NQScorllPageChildView.h"
@protocolNQScorllPageDelegate;
@interface NQScorllPage :UIView<UIScrollViewDelegate>
{
NQScorllPageChildView * last;//上一个
NQScorllPageChildView * current;//当前的
NQScorllPageChildView * next;//下一个
UIScrollView * pageControl;//翻页控制器
NSInteger pageNumber;//当前显示页
}
@property(nonatomic,assign)id<NQScorllPageDelegate> delegate;
@property(nonatomic,retain)UIScrollView * pageControl;//翻页控制器
@property(nonatomic,assign)NSInteger pageNumber; //当前显示页
@property(nonatomic,retain)NQScorllPageChildView * last;
@property(nonatomic,retain)NQScorllPageChildView * current;
@property(nonatomic,retain)NQScorllPageChildView * next;
@property(nonatomic,retain)NSMutableArray * subScorllPages;//同步的子视图
@property(nonatomic,assign)BOOL isVertical;//是否垂直
@property(nonatomic,assign)BOOL isSynchronization; //是否启动同步
@property(nonatomic,assign)BOOL scrollPageEnabled; //是否可以滑动,默认不可以滑动
@property(nonatomic,assign)BOOL paddingPageEnabled; //是否适应页
@property(nonatomic,assign)NSInteger pageMax;
-(void)scrollToNextPage;//下一页
-(void)scrollToLastPage;//上一页
@end
@protocol NQScorllPageDelegate <NSObject>
@optional
//滑动超过一半时触发
-(void)excessHalfPageSCorllPage:(NQScorllPage*) scorllPage pageNumber:(NSNumber *) pagenumber;
//开始滑动时执行
-(void)scrollViewMove:(NQScorllPage*) scorllPage pageNumber:(NSNumber*) pagenumber;
//完成滑动后执行
-(void)scrollViewDidEnd:(NQScorllPage*) scorllPage pageNumber:(NSNumber*) pagenumber;
//滚动到下一页时执行
-(void)scrollViewNextPage:(NQScorllPage *) scorllPage pageNumber:(NSNumber *)pagenumber;
//滚动到上一页时执行
-(void)scrollViewLastPage:(NQScorllPage *) scorllPage pageNumber:(NSNumber *)pagenumber;
@end
二、源文件
//
// NQScorllPage.m
// IpadBlackDemo
//
// Created by ch_soft on 11-11-17.
// Copyright 2011年 __MyCompanyName__. All rights reserved.
//
#import"NQScorllPage.h"
@implementation NQScorllPage
@synthesize isVertical;
@synthesize delegate,pageControl,pageNumber,scrollPageEnabled,paddingPageEnabled,pageMax;
@synthesize last,next,current;
@synthesize subScorllPages,isSynchronization;
-(void)initScorllPage
{
//垂直的情况
if (isVertical) {
pageControl.contentSize=CGSizeMake(pageControl.frame.size.width,10*pageControl.frame.size.height);
if (current==nil) {
current=[[NQScorllPageChildViewalloc] initWithFrame:pageControl.frame];
}
CGRect lastFrame=CGRectMake(current.frame.origin.x,current.frame.origin.y-current.frame.size.height,current.frame.size.width,current.frame.size.height);
CGRect nextFrame=CGRectMake(current.frame.origin.x,current.frame.origin.y+current.frame.size.height,current.frame.size.width,current.frame.size.height);
if (last==nil) {
last=[[NQScorllPageChildView alloc] initWithFrame:lastFrame];
}
if (next==nil) {
next=[[NQScorllPageChildView alloc] initWithFrame:nextFrame];
}
}else//水平的情况
{
pageControl.contentSize=CGSizeMake(10*pageControl.frame.size.width,pageControl.frame.size.height);
if (current==nil) {
current=[[NQScorllPageChildViewalloc] initWithFrame:pageControl.frame];
}
CGRect lastFrame=CGRectMake(current.frame.origin.x-current.frame.size.width,current.frame.origin.y,current.frame.size.width,current.frame.size.height);
CGRect nextFrame=CGRectMake(current.frame.origin.x+current.frame.size.width,current.frame.origin.y,current.frame.size.width,current.frame.size.height);
if (last==nil) {
last=[[NQScorllPageChildView alloc] initWithFrame:lastFrame];
}
if (next==nil) {
next=[[NQScorllPageChildView alloc] initWithFrame:nextFrame];
}
}
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
isVertical=YES;
scrollPageEnabled=NO;
paddingPageEnabled=YES;
pageControl =[[UIScrollView alloc] initWithFrame:CGRectMake(0,0, frame.size.width, frame.size.height)];//得到控制的scorllview
// pageControl.showsHorizontalScrollIndicator=NO;
// pageControl.showsVerticalScrollIndicator=NO;
pageControl.pagingEnabled=paddingPageEnabled;
pageControl.delegate=self;
pageControl.showsHorizontalScrollIndicator=YES;
pageControl.scrollEnabled=scrollPageEnabled;
[selfinitScorllPage];
[selfaddSubview:pageControl];
[pageControladdSubview:last];
[pageControladdSubview:current];
[pageControladdSubview:next];
}
return self;
}
- (void)dealloc {
[pageControlrelease];
[nextrelease];
[lastrelease];
[superdealloc];
}
#pragma mark
#pragma mark UIScrollViewdelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
{
CGFloat pageHeight = self.frame.size.height;
CGFloat pageWidth=self.frame.size.width;
if (delegate!=nil&&[delegaterespondsToSelector:@selector(scrollViewMove:pageNumber:)]) {
[delegateperformSelector:@selector(scrollViewMove:pageNumber:)withObject:selfwithObject:[NSNumbernumberWithInt:pageNumber]];
}
/**************************************** 垂直的情况 ******************************************/
if (isVertical) {
//判段是否同步
if (isSynchronization&&[subScorllPagescount]>0) {
//相对子scorllpage的偏移量
for (int i=0; i<[subScorllPagescount]; i++) {
NQScorllPage * temp=[subScorllPages objectAtIndex:i];
CGPoint offset;
offset.x =0;
offset.y =floor(temp.frame.size.height/pageControl.frame.size.height*pageControl.contentOffset.y);
[temp.pageControlsetContentOffset:offset animated:NO];
}
}
NQScorllPageChildView *tempChildView= nil;
int page = floor((pageControl.contentOffset.y + pageHeight /2) / pageHeight);
if (pageNumber == page||abs(page-pageNumber)>1) {
return;
}elseif (pageNumber +1 == page) { // 页面向上滑动了一页
tempChildView =current; //这里只换顺序,不改变位置.
current=next;
next=last;
last=tempChildView;
pageNumber = page;
if (delegate!=nil&&[delegaterespondsToSelector:@selector(scrollViewNextPage:pageNumber:)]) {
[delegateperformSelector:@selector(scrollViewNextPage:pageNumber:)withObject:selfwithObject:[NSNumbernumberWithInt:pageNumber]];
}
}elseif (pageNumber -1 == page) { // 页面向下滑动了一页
tempChildView =current;
current=last;
last=next;
next=tempChildView;
pageNumber = page;
if (delegate!=nil&&[delegaterespondsToSelector:@selector(scrollViewLastPage:pageNumber:)]) {
[delegateperformSelector:@selector(scrollViewLastPage:pageNumber:)withObject:selfwithObject:[NSNumbernumberWithInt:pageNumber]];
}
}
//对三个视图重新定位
current.frame = CGRectMake( 0,pageNumber* pageHeight,pageControl.frame.size.width,pageControl.frame.size.height);
last.frame = CGRectMake( 0,(pageNumber -1)* pageHeight, pageControl.frame.size.width,pageControl.frame.size.height);
next.frame = CGRectMake( 0,(pageNumber +1)* pageHeight, pageControl.frame.size.width,pageControl.frame.size.height);
}else
{
/**************************************** 水平的情况 ******************************************/
//判段是否同步
if (isSynchronization&&[subScorllPagescount]>0) {
//相对子scorllpage的偏移量
for (int i=0; i<[subScorllPagescount]; i++) {
NQScorllPage * temp=[subScorllPages objectAtIndex:i];
CGPoint offset;
offset.x =floor(temp.frame.size.width/pageControl.frame.size.width*pageControl.contentOffset.x);
offset.y =0;
[temp.pageControlsetContentOffset:offset animated:NO];
}
}
NQScorllPageChildView *tempChildView= nil;
int page = floor((pageControl.contentOffset.x + pageWidth /2) / pageWidth);
if (pageNumber == page||abs(page-pageNumber)>1) {
return;
}elseif (pageNumber +1 == page) { // 页面向上滑动了一页
tempChildView =current; //这里只换顺序,不改变位置.
current=next;
next=last;
last=tempChildView;
pageNumber = page;
if (delegate!=nil&&[delegaterespondsToSelector:@selector(scrollViewNextPage:pageNumber:)]) {
[delegateperformSelector:@selector(scrollViewNextPage:pageNumber:)withObject:selfwithObject:[NSNumbernumberWithInt:pageNumber]];
}
}elseif (pageNumber -1 == page) { // 页面向下滑动了一页
tempChildView =current;
current=last;
last=next;
next=tempChildView;
pageNumber = page;
if (delegate!=nil&&[delegaterespondsToSelector:@selector(scrollViewLastPage:pageNumber:)]) {
[delegateperformSelector:@selector(scrollViewLastPage:pageNumber:)withObject:selfwithObject:[NSNumbernumberWithInt:pageNumber]];
}
}
//对三个视图重新定位
current.frame =CGRectMake(pageNumber* pageWidth,0,pageControl.frame.size.width,pageControl.frame.size.height);
last.frame = CGRectMake( (pageNumber - 1)* pageWidth,0, pageControl.frame.size.width,pageControl.frame.size.height);
next.frame = CGRectMake( (pageNumber + 1)* pageWidth,0, pageControl.frame.size.width,pageControl.frame.size.height);
}
if (delegate!=nil&&[delegaterespondsToSelector:@selector(excessHalfPageSCorllPage:pageNumber:)]) {
[delegateperformSelector:@selector(excessHalfPageSCorllPage:pageNumber:)withObject:selfwithObject:[NSNumbernumberWithInt:pageNumber]];
}
}
//开始拖动
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView; {
}
//完成拖动
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
{
}
//开始减速
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView;
{
}
//完成减速
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
{
if (pageMax==0) {
if (isVertical) {
pageControl.contentSize=CGSizeMake(pageControl.frame.size.width, (pageNumber+15)*pageControl.frame.size.height);
}else
{
pageControl.contentSize=CGSizeMake((pageNumber+15)*pageControl.frame.size.width,pageControl.frame.size.height);
}
}
//判段是否同步
if (isSynchronization&&[subScorllPagescount]>0) {
for (int i=0; i<[subScorllPagescount]; i++) {
NQScorllPage * temp=[subScorllPages objectAtIndex:i];
temp.pageNumber=pageNumber;
}
}
if (delegate!=nil&&[delegaterespondsToSelector:@selector(scrollViewDidEnd:pageNumber:)]) {
[delegateperformSelector:@selector(scrollViewDidEnd:pageNumber:)withObject:selfwithObject:[NSNumbernumberWithInt:pageNumber]];
}
}
-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
if (pageMax==0) {
if (isVertical) {
pageControl.contentSize=CGSizeMake(pageControl.frame.size.width, (pageNumber+15)*pageControl.frame.size.height);
}else
{
pageControl.contentSize=CGSizeMake((pageNumber+15)*pageControl.frame.size.width,pageControl.frame.size.height);
}
}
//判段是否同步
if (isSynchronization&&[subScorllPagescount]>0) {
for (int i=0; i<[subScorllPagescount]; i++) {
NQScorllPage * temp=[subScorllPages objectAtIndex:i];
temp.pageNumber=pageNumber;
}
}
if (delegate!=nil&&[delegaterespondsToSelector:@selector(scrollViewDidEnd:pageNumber:)]) {
[delegateperformSelector:@selector(scrollViewDidEnd:pageNumber:)withObject:selfwithObject:[NSNumbernumberWithInt:pageNumber]];
}
}
#pragma mark
#pragma mark custom method
-(void)scrollToNextPage;
{
// if (isVertical) {
// pageMax=newPageMax;
// pageControl.contentSize=CGSizeMake(pageControl.frame.size.width, (pageMax)* pageControl.frame.size.height);
// }else{
// pageControl.contentSize=CGSizeMake((pageMax)*pageControl.frame.size.width, pageControl.frame.size.height);
// }
if (pageMax==0) {
if (isVertical) {
CGPoint offset;
offset.x =0;
offset.y = (pageNumber+1)*pageControl.frame.size.height;
[pageControlsetContentOffset:offset animated:YES];
}else
{
CGPoint offset;
offset.x = (pageNumber+1)*pageControl.frame.size.width;
offset.y =0;
[pageControlsetContentOffset:offset animated:YES];
}
}else
{
if (isVertical) {
CGPoint offset;
offset.x =0;
offset.y = (pageNumber+1)*pageControl.frame.size.height;
NSLog(@"1111 is %f,2222 is %f",offset.y+pageControl.frame.size.width,(pageMax)*pageControl.frame.size.height);
if (offset.y+pageControl.frame.size.height> (pageMax)*pageControl.frame.size.height) {
return;
}
[pageControlsetContentOffset:offset animated:YES];
}else
{
CGPoint offset;
offset.x = (pageNumber+1)*pageControl.frame.size.width;
offset.y =0;
if (offset.x> (pageMax)*pageControl.frame.size.height) {
return;
}
[pageControlsetContentOffset:offset animated:YES];
}
}
}
-(void)scrollToLastPage;
{
if (pageNumber-1<0) {
return;
}
if (isVertical) {
CGPoint offset;
offset.x =0;
offset.y = (pageNumber-1)*pageControl.frame.size.height;
[pageControlsetContentOffset:offset animated:YES];
}else
{
CGPoint offset;
offset.x = (pageNumber-1)*pageControl.frame.size.width;
offset.y =0;
[pageControlsetContentOffset:offset animated:YES];
}
}
#pragma mark
#pragma mark get/set method
//get/set method
-(void)setScrollPageEnabled:(BOOL) newscrollPageEnabled
{
scrollPageEnabled=newscrollPageEnabled;
pageControl.scrollEnabled=scrollPageEnabled;
}
-(void)setPaddingPageEnabled:(BOOL)newpaddingPageEnabled
{
paddingPageEnabled=newpaddingPageEnabled;
pageControl.pagingEnabled=paddingPageEnabled;
}
-(void)setIsVertical:(BOOL)newisVertical
{
isVertical=newisVertical;
[selfinitScorllPage];
}
-(void)setLast:(NQScorllPageChildView *)newlast
{
CGRect lastframe=last.frame;
if (newlast!=last) {
[lastrelease];
newlast.frame=lastframe;
last=[newlast retain];
[pageControladdSubview:last];
}
}
-(void)setCurrent:(NQScorllPageChildView *)newcurrent
{
CGRect currentframe=current.frame;
if (newcurrent!=current) {
[currentrelease];
newcurrent.frame=currentframe;
current=[newcurrent retain];
[pageControladdSubview:current];
}
}
-(void)setNext:(NQScorllPageChildView *)newnext
{
CGRect nextframe=next.frame;
if (newnext!=next) {
[nextrelease];
newnext.frame=nextframe;
next=[newnext retain];
[pageControladdSubview:next];
}
}
-(void)setPageNumber:(NSInteger)newPageNumber
{
pageNumber=newPageNumber;
CGFloat pageHeight = self.frame.size.height;
CGFloat pageWidth=self.frame.size.width;
if (isVertical) {
pageControl.contentSize=CGSizeMake(pageControl.frame.size.width, (pageNumber+10)*pageControl.frame.size.height);
[pageControlsetContentOffset:CGPointMake(0,pageNumber*pageHeight)animated:NO];
//对三个视图重新定位
current.frame = CGRectMake( 0,pageNumber* pageHeight,pageControl.frame.size.width,pageControl.frame.size.height);
last.frame = CGRectMake( 0,(pageNumber -1)* pageHeight, pageControl.frame.size.width,pageControl.frame.size.height);
next.frame = CGRectMake( 0,(pageNumber +1)* pageHeight, pageControl.frame.size.width,pageControl.frame.size.height);
}else
{
pageControl.contentSize=CGSizeMake((pageNumber+10)*pageControl.frame.size.width,pageControl.frame.size.height);
[pageControlsetContentOffset:CGPointMake(pageNumber*pageWidth,0)animated:NO];
current.frame =CGRectMake(pageNumber* pageWidth,0,pageControl.frame.size.width,pageControl.frame.size.height);
last.frame = CGRectMake( (pageNumber - 1)* pageWidth,0, pageControl.frame.size.width,pageControl.frame.size.height);
next.frame = CGRectMake( (pageNumber + 1)* pageWidth,0, pageControl.frame.size.width,pageControl.frame.size.height);
}
}
-(void)setPageMax:(NSInteger)newPageMax
{
if (isVertical) {
pageMax=newPageMax;
pageControl.contentSize=CGSizeMake(pageControl.frame.size.width, (pageMax)* pageControl.frame.size.height);
}else{
pageControl.contentSize=CGSizeMake((pageMax)*pageControl.frame.size.width, pageControl.frame.size.height);
}
}
@end
//
// NQScorllPageChildView.h
// IpadBlackDemo
//
// Created by ch_soft on 11-11-17.
// Copyright 2011年 __MyCompanyName__. All rights reserved.
//
#import<UIKit/UIKit.h>
@interface NQScorllPageChildView :UIView
@end
//
// NQScorllPageChildView.m
// IpadBlackDemo
//
// Created by ch_soft on 11-11-17.
// Copyright 2011年 __MyCompanyName__. All rights reserved.
//
#import"NQScorllPageChildView.h"
@implementation NQScorllPageChildView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
/*
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/
@end