iOS 自定义图片轮播器类。

很多app都有图片轮播器,功能基本都一样,把他单独抽取出来做一个类,以后自己用方便。

//  XBScrollPlay.h
//  图片轮播器
//  Created by 王国栋 on 15/12/20.
//  Copyright © 2015年 xiaobai. All rights reserved.
//

#import <UIKit/UIKit.h>

@class XBScrollPlay;
/**
 *  实现功能:根据设置的图片自动滚动,默认0.5秒。滚动到左右两端自动回滚。手动滚动时定时器不启动,停止时继续自动
 滚动。
 */

@protocol XBScrollPlayItmeSelectDelegate <NSObject>
@optional
-(void)scrollPlayItmeSelected:(NSInteger)index;

@end

@interface XBScrollPlay : UIView

@property (nonatomic,weak) id<XBScrollPlayItmeSelectDelegate> delegate;
/**
 *  滚动的图片
 */
@property (nonatomic,strong) NSMutableArray* pics;
/**
 *  滚动时间间隔
 */
@property (nonatomic,assign) CGFloat interval;

/**
 *  开始滚动
 */
-(void)startScroll;
/**
 *  停止滚动
 */
-(void)endScroll;

@end

//
//  XBScrollPlay.m
//  我的乐校
//
//  Created by 小白 on 15/12/20.
//  Copyright © 2015年 xiaobai. All rights reserved.
//

#import "XBScrollPlay.h"
#import <UIKit/UIKit.h>
@interface XBScrollPlay ()<UIScrollViewDelegate>
@property (nonatomic,strong) UIScrollView* scrollView;//滚动视图;
@property (nonatomic,strong) UIPageControl* pageCtrl;//滚动视图
@property (nonatomic,strong) NSMutableArray* scrollArr;
@property (nonatomic,strong) NSTimer* timer;
@end
@implementation XBScrollPlay

- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        
        self.interval=0.5;
        UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc]init];
        
        [tap addTarget:self action:@selector(click)];
        
        tap.numberOfTapsRequired=1;
        
        [self addGestureRecognizer:tap];
    }
    return self;
}
-(void) click
{
    if ([self.delegate respondsToSelector:@selector(scrollPlayItmeSelected:)]) {
        
        [self.delegate scrollPlayItmeSelected:self.pageCtrl.currentPage];
    }
}
/**
重写Pics的set方法
 */
- (void)setPics:(NSMutableArray *)pics
{
    
    _pics = [NSMutableArray arrayWithArray:pics];
    
    [_pics insertObject:[pics lastObject] atIndex:0];
    
    [_pics addObject:pics[0]];
    
    //1.添加scrollView
    self.scrollView = [[UIScrollView alloc]init];
    self.scrollView.frame =self.bounds;
    self.scrollView.delegate=self;
    self.scrollView.showsHorizontalScrollIndicator=NO;
    self.scrollView.pagingEnabled=YES;
    for (int i=0; i<self.pics.count; i++) {
        UIImageView * imaV = [[UIImageView alloc]initWithFrame:CGRectMake(i*self.frame.size.width, 0, self.frame.size.width,self.frame.size.height)];
        imaV.tag=i+1;
        imaV.contentMode=UIViewContentModeScaleToFill;
        imaV.image =(UIImage*)self.pics[i];
        [self.scrollView addSubview:imaV];
    }
    self.scrollView.contentSize =CGSizeMake(self.frame.size.width*_pics.count, 0) ;
    [self.scrollView setContentOffset:CGPointMake(self.scrollView.frame.size.width, 0)];
    [self addSubview:self.scrollView];
    
    
    //2.添加pageControl
    CGFloat pW = 50;
    CGFloat pH = 30;
    CGFloat pX = (self.frame.size.width-pW)/2;
    CGFloat pY = (self.frame.size.height-pH);
    self.pageCtrl = [[UIPageControl alloc]initWithFrame:CGRectMake(pX,pY,pW,pH)];
    self.pageCtrl.numberOfPages=self.pics.count-2;
    self.pageCtrl.currentPage=0;
    self.pageCtrl.pageIndicatorTintColor=[UIColor blueColor];
    self.pageCtrl.currentPageIndicatorTintColor=[UIColor redColor];
    [self addSubview:self.pageCtrl];
    
}
- (void)startScroll
{
    if (self.timer == nil && self.pics.count>1) {
        self.timer = [NSTimer scheduledTimerWithTimeInterval:self.interval target:self selector:@selector(scrollPic) userInfo:nil repeats:YES];
        // 获取当前的消息循环对象
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        // 改变self.timer对象的优先级
        [runLoop addTimer:self.timer forMode:NSRunLoopCommonModes];
    }
}
- (void)scrollPic
{
    NSInteger page = self.pageCtrl.currentPage;
    
    CGFloat offsetX ;
    if (page == self.pics.count - 3) {
        page = 0;
    } else{
        page++;
    }
    offsetX = (1+page)*self.scrollView.frame.size.width;
    [self.scrollView setContentOffset:CGPointMake(offsetX, 0) animated:YES];
}
-(void)endScroll;
{
    [self.timer invalidate];
    self.timer=nil;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    
    // 如何计算当前滚动到了第几页?
    // 1. 获取滚动的x方向的偏移值
    CGFloat offsetX = scrollView.contentOffset.x;
    // 用已经偏移了得值, 加上半页的宽度
    offsetX = offsetX + (scrollView.frame.size.width * 0.5);
    // 2. 用x方向的偏移的值除以一张图片的宽度(每一页的宽度),取商就是当前滚动到了第几页(索引)
    int page = offsetX / scrollView.frame.size.width;
    // 3. 将页码设置给UIPageControl
    if (page == self.pics.count-1) {
        self.pageCtrl.currentPage = 0;
        [scrollView setContentOffset:CGPointMake(scrollView.frame.size.width, 0)];
    }
    else if(page ==0)
    {
        self.pageCtrl.currentPage = self.pics.count-3;
        [scrollView setContentOffset:CGPointMake(scrollView.frame.size.width*(self.pageCtrl.currentPage+1), 0)];
    }
    else
    {
        self.pageCtrl.currentPage=page-1;
    }
}
// 实现即将开始拖拽的时候就停止定时器
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self endScroll];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    [self startScroll];
}
@end

Demo下载地址: 点击打开链接


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本Demo使用UICollectionView实现自动无限轮播功能。 主要功能: 1.实现自动轮播,可修改轮播的时间 2.轮播图片可以来自本地,也可来自网络,通过单独的方法进行设置即可。对于加载网络图片时,Demo中使用了YYWebImage,也可自行替换成SDWebImage。 3.重写了和系统UIPageControl一样的功能,可用图片代替PageControl上的点点,也可自定义其颜色以及切换动画。 使用方法:使用方法比较简单。 /** * 加载本地图片Banner */ - (void)setupLocalBannerImageView { NSArray *array = @[@"1.png", @"2.png", @"3.png", @"4.png", @"5.png"]; FFBannerView *bannerVew = [FFBannerView bannerViewWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 200) locationImageArray:array]; bannerVew.timeInterval = 2.0; [self.view addSubview:bannerVew]; } /** * 加载网络图片Banner */ - (void)setupNetWorkBannerImageView { NSArray *array = @[@"http://i3.download.fd.pchome.net/t_960x600/g1/M00/07/09/oYYBAFMv8q2IQHunACi90oB0OHIAABbUQAAXO4AKL3q706.jpg", @"http://images.weiphone.net/attachments/photo/Day_120308/118871_91f6133116504086ed1b82e0eb951.jpg", @"http://benyouhuifile.it168.com/forum/macos/attachments/month_1104/110425215921926a173e0f728e.jpg", @"http://benyouhuifile.it168.com/forum/macos/attachments/month_1104/1104241737046031b3a754f783.jpg"]; FFBannerView *bannerVew = [FFBannerView bannerViewWithFrame:CGRectMake(0, 250, [UIScreen mainScreen].bounds.size.width, 200) netWorkImageArray:array placeHolderImage:nil]; bannerVew.timeInterval = 2.0; bannerVew.pageControlStyle = FFPageControlStyleMiddle; bannerVew.delegate = self; [self.view addSubview:bannerVew]; } 以上方式即可简单使用,如需自定义PageControl也可继承FFAbstractDotView,做些基本的设置即可。 gitHub下载地址:喜欢的朋友请给个星呗! 欢迎各位一起来讨论,有问题请发邮箱270452746@qq.com或者直接加我QQ:270452746进行讨论。谢谢!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值