IOS系列——Scrollview的循环滚动

#import <UIKit/UIKit.h>
 
typedef  enum _CycleDirection
{ PortaitDirection,LandscapeDirection } CycleDirection;
 
 
@interface CycleScrollView : UIView<UIScrollViewDelegate> {
    UIScrollView *scrollView;
    UIImageView *curImageView;
    
    int totalPage;  
    int curPage;
    CGRect scrollFrame;
    
    CycleDirection scrollDirection;    // scrollView滚动的方向
    NSArray *imagesArray;   // 存放所有需要滚动的图片
    NSMutableArray *curImages; //存放当前滚动的三张图片
    
}
 
- (int) validPageValue:(NSInteger)value;
- (id) initWithFrame:(CGRect)frame cycleDirection:(CycleDirection)direction pictures:(NSArray*)pictureArray;
- (NSArray*) getDisplayImagesWithCurpage:(int)page;
- (void) refreshScrollView;
@end
 
 
 
//
//  CycleScrollView.m
//  CycleScrollView
//
//  Created by mini5 on 28/07/2011.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//
 
#import "CycleScrollView.h"
 
 
@implementation CycleScrollView
 
- (id) initWithFrame:(CGRect)frame cycleDirection:(CycleDirection)direction pictures:(NSArray*)pictureArray
{
    self=[super initWithFrame:frame];
    if(self)
    {
        scrollFrame=frame;
        scrollDirection=direction;
        totalPage=[pictureArray count];
        curPage=1;  //当前显示的是图片数组里的第一张图片
        curImages=[[NSMutableArray alloc] init];
        imagesArray=[[NSArray alloc] initWithArray:pictureArray];
        
        scrollView=[[UIScrollView alloc] initWithFrame:frame];
        scrollView.backgroundColor=[UIColor blueColor];
        scrollView.showsHorizontalScrollIndicator=NO;
        scrollView.showsVerticalScrollIndicator=NO;
        scrollView.pagingEnabled=YES;
        scrollView.delegate=self;
        [self addSubview:scrollView];
        if(scrollDirection==PortaitDirection)   //在竖直方向滚动
        {
            scrollView.contentSize=CGSizeMake(scrollView.frame.size.width,scrollView.frame.size.height*3);     //竖直方法可以存放三张图片
        }
        if(scrollDirection==LandscapeDirection) //在水平方向滚动
        {
            scrollView.contentSize=CGSizeMake(scrollView.frame.size.width*3,scrollView.frame.size.height);
        }
        [self addSubview:scrollView];
        [self refreshScrollView];
    }
    return self;
}
 
- (void) refreshScrollView
{
    NSArray *subViews=[scrollView subviews];
    if([subViews count]!=0)
    {
        [subViews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    }
    
    [self getDisplayImagesWithCurpage:curPage];
    UIImage *preImage=[curImages objectAtIndex:0];
    UIImage *curImage=[curImages objectAtIndex:1];
    UIImage *lastImage=[curImages objectAtIndex:2];
    UIImageView *preView=[[UIImageView alloc] initWithImage:preImage];
    UIImageView *curView=[[UIImageView alloc] initWithImage:curImage];
    UIImageView *lastView=[[UIImageView alloc] initWithImage:lastImage];
    [scrollView addSubview:preView];
    [scrollView addSubview:curView];
    [scrollView addSubview:lastView];
    [preView release];
    [curView release];
    [lastView release];
    if(scrollDirection==PortaitDirection)   //竖直滚动
    {
        preView.frame=CGRectOffset(preView.frame, 0, 0);
        curView.frame=CGRectOffset(curView.frame, 0, scrollFrame.size.height);
        lastView.frame=CGRectOffset(lastView.frame, 0, 2*scrollFrame.size.height);
        [scrollView setContentOffset:CGPointMake(0, scrollFrame.size.height)];
    }
    
    if(scrollDirection==LandscapeDirection) //水平滚动
    {
        preView.frame=CGRectOffset(preView.frame, 0, 0);
        curView.frame=CGRectOffset(curView.frame, scrollFrame.size.width, 0);
        lastView.frame=CGRectOffset(lastView.frame, scrollFrame.size.width*2, 0);
        [scrollView setContentOffset:CGPointMake(scrollFrame.size.width, 0)];
    }
}
 
- (NSArray*) getDisplayImagesWithCurpage:(int)page
{
    int pre=[self validPageValue:curPage-1];
    int last=[self validPageValue:curPage+1];
    if([curImages count]!=0)    [curImages removeAllObjects];
    [curImages addObject:[imagesArray objectAtIndex:pre-1]];
    [curImages addObject:[imagesArray objectAtIndex:curPage-1]];
    [curImages addObject:[imagesArray objectAtIndex:last-1]];
    return curImages;
}
 
- (int)validPageValue:(NSInteger)value
{
    if(value==0)    value=totalPage;    //value=1为第一张,value=0为前面一张
    if(value==totalPage+1)  value=1;
    return value;
}
 
 
- (void) scrollViewDidScroll:(UIScrollView *)crollView
{
    int x=crollView.contentOffset.x;
    int y=crollView.contentOffset.y;
    if(scrollDirection==LandscapeDirection) //水平滚动
    {
        if(x>=2*scrollFrame.size.width) //往下翻一张
        {
            curPage=[self validPageValue:curPage+1];
            [self refreshScrollView];
        }
        
        if(x<=0)
        {
            curPage=[self validPageValue:curPage-1];
            [self refreshScrollView];
        }
    }
    
    //竖直滚动
    if(scrollDirection==PortaitDirection)
    {
        if(y==2*scrollFrame.size.height)
        {
            curPage=[self validPageValue:curPage+1];
            [self refreshScrollView];
        }
    }
}
 
 
 
- (void)dealloc
{
    [imagesArray release];
    [curImages release];
    [super dealloc];
}
 
@end

转载与http://blog.sina.com.cn/s/blog_93f39bc20100vgsd.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值