//

//  CycleScrollView.h

//  PagedScrollView

//

//  Created by 李洪强 on 16-1-23.

//  Copyright (c) 2016年 李洪强. All rights reserved.

//

#import <UIKit/UIKit.h>

@interface CycleScrollView : UIView

@property (nonatomic , strong) NSTimer *animationTimer;

@property (nonatomic , readonly) UIScrollView *scrollView;

/**

*  初始化

*

*  @param frame             frame

*  @param animationDuration 自动滚动的间隔时长。如果<=0,不自动滚动。

*

*  @return instance

*/

- (id)initWithFrame:(CGRect)frame animationDuration:(NSTimeInterval)animationDuration;

- (void)pause;

- (void)restart;

/**

数据源:获取总的page个数

**/

@property (nonatomic ,copy) NSInteger (^totalPagesCount)(void);

/**

数据源:获取第pageIndex个位置的contentView

**/

@property (nonatomic , copy) UIView *(^fetchContentViewAtIndex)(NSInteger pageIndex);

/**

当点击的时候,执行的block

**/

@property (nonatomic , copy) void (^TapActionBlock)(NSInteger pageIndex);

@end



-------------------------------------------------------------------

//

//  CycleScrollView.m

//  PagedScrollView

//

//  Created by 李洪强 on 16-1-23.

//  Copyright (c) 2014年 李洪强. All rights reserved.

//

#import "CycleScrollView.h"

#import "NSTimer+Addition.h"

@interface CycleScrollView () <UIScrollViewDelegate>

{

BOOL onlyOnePage;

}

@property (nonatomic , assign) NSInteger currentPageIndex;

@property (nonatomic , assign) NSInteger totalPageCount;

@property (nonatomic , strong) NSMutableArray *contentViews;

@property (nonatomic , strong) UIScrollView *scrollView;

@property (nonatomic , assign) NSTimeInterval animationDuration;

@property (nonatomic,strong) UIPageControl *pageControl;

@end

@implementation CycleScrollView

- (void)dealloc{

[self.animationTimer invalidate];

self.animationTimer = nil;

}

- (void)setTotalPagesCount:(NSInteger (^)(void))totalPagesCount{

_totalPageCount = totalPagesCount();

_pageControl.numberOfPages  = _totalPageCount;

if (_totalPageCount > 0) {

if (_totalPageCount > 1) {

[self startTimerWithRepeats:YES];

}

else{

self.animationDuration = 0.01;

onlyOnePage = YES;

[self startTimerWithRepeats:NO];

}

}

}

- (void)startTimerWithRepeats:(BOOL)repeats{

if (!self.animationTimer){

self.animationTimer = [NSTimer scheduledTimerWithTimeInterval:self.animationDuration

target:self

selector:@selector(animationTimerDidFired:)

userInfo:nil

repeats:repeats];

}

[self.animationTimer pauseTimer];

CGPoint newOffset = CGPointMake(self.scrollView.contentOffset.x + CGRectGetWidth(self.scrollView.frame), self.scrollView.contentOffset.y);

[self.scrollView setContentOffset:newOffset animated:repeats];

[self configContentViews];

[self.animationTimer resumeTimerAfterTimeInterval:self.animationDuration];

}

- (id)initWithFrame:(CGRect)frame animationDuration:(NSTimeInterval)animationDuration{

self = [self initWithFrame:frame];

if (animationDuration > 0.0) {

self.animationDuration = animationDuration;

}

return self;

}

- (id)initWithFrame:(CGRect)frame{

self = [super initWithFrame:frame];

if (self) {

// Initialization code

self.autoresizesSubviews = YES;

self.scrollView = [[UIScrollView alloc] initWithFrame:self.frame];

self.scrollView.showsHorizontalScrollIndicator = NO;

self.scrollView.autoresizingMask = 0xFF;

self.scrollView.contentMode = UIViewContentModeCenter;

self.scrollView.contentSize = CGSizeMake(3 * CGRectGetWidth(self.frame), 0);//.scrollView.frame

self.scrollView.delegate = self;

self.scrollView.contentOffset = CGPointMake(CGRectGetWidth(self.frame), 0);//self.scrollView.frame

self.scrollView.pagingEnabled = YES;

[self addSubview:self.scrollView];

_scrollView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;

self.currentPageIndex = 0;

_pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(0, frame.size.height - 20, 100, 20)];

CGFloat centerY = _pageControl.center.y;

_pageControl.center = CGPointMake(self.width/2,centerY);

[self addSubview:_pageControl];

}

return self;

}

#pragma mark -

#pragma mark - 私有函数

- (void)configContentViews{

[self.scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

[self setScrollViewContentDataSource];

NSInteger counter = 0;

for (UIView *contentView in self.contentViews) {

contentView.userInteractionEnabled = YES;

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(contentViewTapAction:)];

[contentView addGestureRecognizer:tapGesture];

CGRect rightRect = contentView.frame;

rightRect.origin = CGPointMake((CGRectGetWidth(self.scrollView.frame)) * (counter++), 0);

contentView.frame = rightRect;

[self.scrollView addSubview:contentView];

}

[_scrollView setContentOffset:CGPointMake(_scrollView.frame.size.width, 0)];

if (onlyOnePage) {

[_scrollView setContentSize:CGSizeMake(_scrollView.size.width, _scrollView.size.height)];

}

}

/**

*  设置scrollView的content数据源,即contentViews

*/

- (void)setScrollViewContentDataSource{

NSInteger previousPageIndex = [self getValidNextPageIndexWithPageIndex:self.currentPageIndex - 1];

NSInteger rearPageIndex = [self getValidNextPageIndexWithPageIndex:self.currentPageIndex + 1];

if (self.contentViews == nil) {

self.contentViews = [@[] mutableCopy];

}

[self.contentViews removeAllObjects];

if (self.fetchContentViewAtIndex) {

[self.contentViews addObject:self.fetchContentViewAtIndex(previousPageIndex)];

[self.contentViews addObject:self.fetchContentViewAtIndex(_currentPageIndex)];

[self.contentViews addObject:self.fetchContentViewAtIndex(rearPageIndex)];

}

}

- (NSInteger)getValidNextPageIndexWithPageIndex:(NSInteger)currentPageIndex;

{

if(currentPageIndex == -1) {

return self.totalPageCount - 1;

} else if (currentPageIndex == self.totalPageCount) {

return 0;

} else {

return currentPageIndex;

}

}

#pragma mark -

#pragma mark - UIScrollViewDelegate

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

{

[self.animationTimer pauseTimer];

}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

{

[self.animationTimer resumeTimerAfterTimeInterval:self.animationDuration];

}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

{

int contentOffsetX = scrollView.contentOffset.x;

if(contentOffsetX >= (2 * CGRectGetWidth(scrollView.frame))) {

self.currentPageIndex = [self getValidNextPageIndexWithPageIndex:self.currentPageIndex + 1];

self.pageControl.currentPage = self.currentPageIndex;

//        NSLog(@"next,当前页:%d",self.currentPageIndex);

[self configContentViews];

}

if(contentOffsetX <= 0) {

self.currentPageIndex = [self getValidNextPageIndexWithPageIndex:self.currentPageIndex - 1];

self.pageControl.currentPage = self.currentPageIndex;

//        NSLog(@"previous,当前页:%d",self.currentPageIndex);

[self configContentViews];

}

}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

{

[scrollView setContentOffset:CGPointMake(CGRectGetWidth(scrollView.frame), 0) animated:YES];

}

#pragma mark -

#pragma mark - 响应事件

- (void)animationTimerDidFired:(NSTimer *)timer

{

CGPoint newOffset = CGPointMake(self.scrollView.contentOffset.x + CGRectGetWidth(self.scrollView.frame), self.scrollView.contentOffset.y);

[self.scrollView setContentOffset:newOffset animated:YES];

}

- (void)contentViewTapAction:(UITapGestureRecognizer *)tap

{

if (self.TapActionBlock) {

self.TapActionBlock(self.currentPageIndex);

}

}

#pragma mark - 暂停  开始

- (void)pause{

[self.animationTimer pauseTimer];

}

- (void)restart{

[self.animationTimer resumeTimer];

}

@end

CycleScrollView实现轮播图的更多相关文章

  1. 李洪强iOS开发之使用CycleScrollView实现轮播图

    01 导入头文件,并且定义CycleScrollView属性 02 初始化,设置frame并且添加到collectionView上 03 调用方法并且设置轮播的图片

  2. iOS开发之 用第三方类库实现轮播图

    在github上面有很多的第三方类库,大大节约了大家的开发时间 下载地址:https://github.com/gsdios/SDCycleScrollView 现已支持cocoapods导入:pod ...

  3. js 基础篇(点击事件轮播图的实现)

    轮播图在以后的应用中还是比较常见的,不需要多少行代码就能实现.但是在只掌握了js基础知识的情况下,怎么来用较少的而且逻辑又简单的方法来实现呢?下面来分析下几种不同的做法: 1.利用位移的方法来实现 首 ...

  4. 实现下来ScrollView放大轮播图

    创建工程,创建一个UIScrollView属性,并遵循其协议: #define kWidth self.view.frame.size.width//屏幕宽 #define kHeight self. ...

  5. ViewPager轮播图

    LoopViewPagerLayout无限轮播 项目地址:https://github.com/why168/LoopViewPagerLayout 支持三种动画: 支持修改轮播的速度: 支持修改滑动 ...

  6. CSS-用伪类制作小箭头(轮播图的左右切换btn)

    先上学习地址:http://www.htmleaf.com/Demo/201610234136.html 作者对轮播图左右按钮的处理方法一改往常,不是简单地用btn.prev+btn.next的图片代 ...

  7. phpcms首页实现轮播图

    1.在你想要加轮播图的位置加入以下 <div id="flowDiagram" > <div id="button"> <span ...

  8. React视角下的轮播图

    天猫购物网站最显眼的就是轮播图了.我在学习一样新js库,一个新框架或新的编程思想的时候,总是感叹"入门必做选项卡,进阶须撸轮播图."作为一个React组件,它是状态操控行为的典型, ...

  9. Jquery 轮播图简易框架

    =====================基本结构===================== <div class="carousel" style="width: ...

随机推荐

  1. jedis访问redis学习笔记

    最近在学习redis,在网上查了些文章,利用他人已有的知识,总结写下了这篇文章,大部分内容还是引用别人的文章内容.经过测试发现spring-data-redis现在有的版本只能支持reids 2.6和 ...

  2. 闲话:你今天OO了吗?

    如果你的分析习惯是在调研技术的时候最先弄清楚有多少业务流程,先画出业务流程图,然后顺藤摸瓜,找出业务流程中每一步骤的参与部门或岗位,弄清楚在这一步参与者所做的事情和填写表单的结果,并关心用户是如何把这 ...

  3. Apache 配置多端口 多虚拟主机 局域网访问

    \wamp\bin\apache\Apache2.4.4\conf\extra\httpd-vhosts.conf 修改如下 NameVirtualHost *:80          Documen ...

  4. ios 相册相关

    1.ALAssetsLibrary 系统中的资源库,可以使用他来访问资源库中的资源,照片.视屏等.     [ALAssetsLibrary authorizationStatus];获取当前应用能否 ...

  5. iOS 添加占位符

    添加占位符: 首先占位符的大小要比textView 的大小要小一些 1.添加一个取消键盘的通知 2.添加一个代理事件 1. // removeKeyBoard 添加通知收回键盘 [[NSNotific ...

  6. Activiti安装

    1.Activiti下载与简介 1.1  简介 Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG), ...

  7. 【培训】交换机VLAN

    为了解决用交换机做LAN互联无法限制广播的问题,出现了VLAN技术,把一个LAN划分为多个逻辑的“LAN”-VLAN. VLAN技术将一个物理的LAN逻辑地划分为不同的广播域,每一个VLAN包含一组有 ...

  8. leetcode169——Majority Element (C++)

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  9. Jquery 动态生成表单 并将表单数据 批量通过Ajax插入到数据库

    利用Jquery 动态生成 Table 表单 之后利用each 方法来遍历所有文本框获取文本的value值  并通过Ajax 将数据 提交到Web服务里把数据插入数据库 Html页面 <!DOC ...

  10. mysql 断电 启动不了 start: Job failed to start

    公司内部服务器,突然断电,造成无法启动的解决办法 把my.cnf中配置的datadir路径下的ib_logfile* (比如ib_logfile0, lb_logfile1....)文件移到另外一个目 ...