UIScrollView循环滚动

.h文件

#import <UIKit/UIKit.h>

@protocol EScrollerViewDelegate <NSObject>
@optional
-(void)scrollImageViewDelegateClickImage:(NSInteger)index withView:(UIImageView*)imgView;
@end

@interface SYScrollerView : UIView<UIScrollViewDelegate> {
	CGRect viewSize;
	UIScrollView *scrollView;
	NSArray *imageArray;
    NSArray *titleArray;
    UIPageControl *pageControl;
    int currentPageIndex;
}
@property(nonatomic,assign)id<EScrollerViewDelegate> delegate;
-(id)initWithFrameRect:(CGRect)rect imageArray:(NSArray *)imgArr;
@end

.m文件

#import "SYScrollerView.h"
#import "UIImageView+WebCache.h"
#import "MyDefine.h"
#define IMAGE_PLACEHOLDER @"activity_background"
#define H_LB 15
@implementation SYScrollerView
@synthesize delegate;

-(id)initWithFrameRect:(CGRect)rect imageArray:(NSArray *)imgArr
{

	if ((self=[super initWithFrame:rect])) {
        self.userInteractionEnabled=YES;
        //创建一个arr存放imaArr,这样滑动的可以流畅些
        NSMutableArray *tempArray=[NSMutableArray arrayWithArray:imgArr];
        [tempArray insertObject:[imgArr objectAtIndex:([imgArr count]-1)] atIndex:0];//最后一张
        [tempArray addObject:[imgArr objectAtIndex:0]];//第一张
		imageArray=[NSArray arrayWithArray:tempArray];
		viewSize=rect;
        NSUInteger pageCount=[imageArray count];
        scrollView=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, viewSize.size.width, viewSize.size.height)];
        scrollView.pagingEnabled = YES;
        scrollView.contentSize = CGSizeMake(viewSize.size.width * pageCount, viewSize.size.height);
        scrollView.showsHorizontalScrollIndicator = NO;
        scrollView.showsVerticalScrollIndicator = NO;
        scrollView.scrollsToTop = NO;
        scrollView.delegate = self;

        for (int i=0; i<pageCount; i++) {
            NSString *imgURL=[imageArray objectAtIndex:i];
            UIImageView *imgView=[[UIImageView alloc] init];
            //区分下是不是网络图
            if ([imgURL hasPrefix:@"http://"]) {
                //网络图片
                [imgView sd_setImageWithURL: [NSURL URLWithString:imgURL] placeholderImage:[UIImage imageNamed:IMAGE_PLACEHOLDER]];
            }else{
                UIImage *img=[UIImage imageNamed:[imageArray objectAtIndex:i]];
                [imgView setImage:img];
            }

            [imgView setFrame:CGRectMake(viewSize.size.width*i, 0,viewSize.size.width, viewSize.size.height)];
            imgView.tag=i;
            UITapGestureRecognizer *Tap =[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleFingerEvent:)] ;
            [Tap setNumberOfTapsRequired:1];
            [Tap setNumberOfTouchesRequired:1];
            imgView.userInteractionEnabled=YES;
            [imgView addGestureRecognizer:Tap];
            [scrollView addSubview:imgView];
        }
        [scrollView setContentOffset:CGPointMake(viewSize.size.width, 0)];
        [self addSubview:scrollView];

        pageControl=[[UIPageControl alloc]initWithFrame:CGRectMake(0,viewSize.size.height - H_LB, viewSize.size.width, H_LB)];
        pageControl.currentPage=0;
        pageControl.numberOfPages=(pageCount-2);
        pageControl.pageIndicatorTintColor = [UIColor lightGrayColor];
        pageControl.currentPageIndicatorTintColor = [UIColor whiteColor];
        [self addSubview:pageControl];

	}
	return self;
}

- (void)scrollViewDidScroll:(UIScrollView *)sender
{
    CGFloat pageWidth = scrollView.frame.size.width;
    int page = floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    currentPageIndex=page;

    pageControl.currentPage=(page-1);

}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView
{
    //判断下当前图片的位置
    if (currentPageIndex==0) {

        [_scrollView setContentOffset:CGPointMake(([imageArray count]-2)*viewSize.size.width, 0)];
    }
    if (currentPageIndex==([imageArray count]-1)) {

        [_scrollView setContentOffset:CGPointMake(viewSize.size.width, 0)];
    }
}
- (void)handleSingleFingerEvent:(UITapGestureRecognizer *)gesture
{
    if ([delegate respondsToSelector:@selector(scrollImageViewDelegateClickImage:withView:)]) {
         [self.delegate scrollImageViewDelegateClickImage:[gesture view].tag withView:(UIImageView*)[gesture view]];
    }
}
@end
时间: 2024-11-15 16:47:03

UIScrollView循环滚动的相关文章

UIScrollView循环滚动图片

转载自  http://www.jianshu.com/p/aa73c273baf2 我们会经常用到循环滚动图片,包括定时滚动,点击触发事件.以前所知道的循环滚动图片的方法是这样的.比如:一共5张图片,位置为1,2,3,4,5. 创建7个imageView. 将最后一张图片放到第一张图片前面,将第一张图片放到最后一张后面,位置为5,1,2,3,4,5,1. 最后一张图片滚动到第一张图片时,先从第二个图片5滚动到第二个图片1,滚动完之后把位置设置为第一个图片1.从后向前滚动同样的原理. 在scro

使用UIScrollView 结合 UIImageView 实现图片循环滚动

场景: 在开发工作中,有时我们需要实现一组图片循环滚动的情况.当我们使用 UIScrollView 结合 UIImageView 来实现时,一般 UIImageView 会尽量考虑重用,下面例子是以(左中右)三个 UIImageView 的使用,其实也可以考虑使用 两个 UIImageView 实现的情况.这样避免 一组图片多少个就对应多少个 UIImageView 所导致占用过多内存的情况. 效果如下: ViewController.h 1 #import <UIKit/UIKit.h> 2

如果做一个循环滚动的UIScrollView

先上效果图: 先初始化: - (void)viewDidLoad { //添加最后一张图 用于循环 int length = 4; NSMutableArray *tempArray = [NSMutableArray array]; for (int i = 0 ; i < length; i++) { NSString* str = [NSString stringWithFormat:@"title%d",i]; [tempArray addObject:str]; } N

利用递归 实现UIScrollView无限滚动的效果

项目需求 利用递归 实现UIScrollView无限滚动的效果. 上机试题, #import "ViewController.h" @interface ViewController (){ UIScrollView *mainScroll; BOOL isFinish; int x; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; x=0; isFinish = YES;

循环滚动scrollView---最后一张图片后面紧跟着第一张图片,第一张图片前面挨着最后一张图片

问题描述:循环滚动scrollView---最后一张图片后面紧跟着第一张图片,第一张图片前面挨着最后一张图片,形成环,循环切换图片. 效果图如下: 具体代码如下: //  ViewController.m #import "ViewController.h" #define kW 375 #define kH 500 #define kCount 11 @interface ViewController () <UIScrollViewDelegate> @end @imp

UIScrollView无限滚动和轮播效果

XX问我一个问题,就是以前做过的无线滚动,-_-||,突然发现没什么印象了,于是赶紧做了个Demo熟悉一下,其实也挺简单的 原理:改变数组,重新加载图片,偏移量1,2,3达到3瞬间回到2,达到2,瞬间回到1 利用3个UIImageView多次利用 贴代码: // // ViewController.m // 测试-滚动 // // Created by lanqs on 15/2/7. // Copyright (c) 2015年 Tanqihong. All rights reserved.

IOS实现自动循环滚动广告--ScrollView的优化和封装

一.问题分析 在许多App中,我们都会见到循环滚动的视图,比如广告,其实想实现这个功能并不难,用ScrollView就可以轻松完成,但是在制作的过程中还存在几个小问题,如果能够正确的处理好这些小问题,无论从效果还是性能上都会得到优化. 问题一 第一个问题是如何用ScrollView来展示N个视图.想要实现这个效果,可以把N个视图依次按顺序添加到ScrollView上,然后把 ScrollView的contentSize设置为N个视图的尺寸,通过滑动ScrollView来查看加在上面的视图. 问题

ScrollView循环滚动图片

涉及到banner页或者相册浏览,考虑到性能问题和用户体验性,经常要用到ScrollView循环滚动图片,在此只分析banner页,相册浏览类似: 设计思想: UIScrollView添加三个ImageView:firstImgView,secondImgView,thirdImgView. 当前每次显示的都是secondImgView,firstImgView显示前一张图片,thirdImgView显示后一张图片,若secondImgView显示的是第一张图片,则firstImgView显示最

iOS 幻灯片的自动循环滚动

首先,我说一下思路,自动滚动的实现是通过定时器进行实现的.当然,考虑到我们在定时循环的时候可能有进行手动滑动,所以我们就要根据 pageControl的当前定点进行判断. 而循环滚动是通过对幻灯片中image多加2进行实现的. 假如你幻灯片中有5个元素需要循环: [0, 1, 2, 3, 4] 那么你在将这四个元素添加到UIScrollView里面的时候,就需要多添加两个,变成这样: [ 4, 0, 1, 2, 3, 4, 0 ] 然后只需要在scrollViewDidEndDecelerati