iOS-创建UIScrollerView(封装UIScrollerView)

创建继承于UIView的类WJImageScrollView,代码实现如下:

WJImageScrollView.h

#import <UIKit/UIKit.h>

/**点击图片block,参数当前图片索引*/
typedef void(^TapImageViewButtonBlock) (NSInteger imageIndex);

@interface WJImageScrollView : UIView
/**切换图片的时间间隔,可选,默认3s*/
@property(nonatomic,assign)CGFloat scrollInterval;
/**页面销毁时应该停止定时器,不然无法释放view 类dealloc时调用
 [timer invalidate]; 
 timer = nil;
 这个方法能解决问题但不明智,有违封装思想,实际使用中优化 */
@property(nonatomic,strong)NSTimer * timer;

/**
 *  创建轮播器:创建时调用这个方法
 *
 *  @param frame  滚动视图的frame
 *  @param images 要显示的图片数组
 *
 *  @return 类的对象
 */
+(instancetype)wjImageScrollViewWithFrame:(CGRect)frame
                               WithImages:(NSArray *)images;

/**
 *
 *
 *  @param frame  滚动视图的frame
 *  @param images 要显示的图片数组
 *
 *  @return 类的对象
 */
-(instancetype)initWithFrame:(CGRect)frame
                  WithIamges:(NSArray *)images;

-(void)addTapEventForImageWithBlock:(TapImageViewButtonBlock)block;
@end

WJImageScrollView.m

#import "WJImageScrollView.h"

@interface WJImageScrollView ()<UIScrollViewDelegate>
@property(nonatomic,strong)UIScrollView * mainScrollView;

@property(nonatomic,assign)CGFloat widthView;

@property(nonatomic,assign)CGFloat hightView;

@property(nonatomic,strong)NSArray * imagesNameArray;

@property(nonatomic,assign)NSInteger currentPage;

@property(nonatomic,assign)UIViewContentMode  imageViewcontentModel;

@property(nonatomic,strong)UIPageControl * imageViewPageControl;

@property(nonatomic,strong)TapImageViewButtonBlock  block;

@end
@implementation WJImageScrollView

+(instancetype)wjImageScrollViewWithFrame:(CGRect)frame
                               WithImages:(NSArray *)images{
    
    WJImageScrollView * instance = [[WJImageScrollView alloc]
                                    initWithFrame:frame
                                    WithIamges:images];
    return instance;

}

-(instancetype)initWithFrame:(CGRect)frame
                  WithIamges:(NSArray *)images{
    
    self = [super initWithFrame:frame];
    self.translatesAutoresizingMaskIntoConstraints = NO;
    if (self) {
        
        /**获取滚动视图的宽度*/
        _widthView = frame.size.width;
        
        /**获取滚动视图的高度*/
        _hightView = frame.size.height;
        
        _scrollInterval = 3;
        
        /**当前显示页面*/
        _currentPage = 0;
        
        _imageViewPageControl = UIViewContentModeScaleToFill;
        
        self.clipsToBounds = YES;
        
        _imagesNameArray = images;
        
        /**初始化滚动视图*/
        [self addSubview:self.mainScrollView];
        
        /**创建ImageView*/
        [self createImageView];
        
        /**添加imageViewPageControl*/
        [self addSubview:self.imageViewPageControl];
        
        /**添加timer*/
        [self startTimer];
    }
    return self;
}

-(void)addTapEventForImageWithBlock:(TapImageViewButtonBlock)block{
    if (self.block == nil) {
        if (block != nil) {
            self.block = block;
            [self initImageViewButton];
            
        }
    }
}

-(void)initImageViewButton{
    for (int i = 0; i <= _imagesNameArray.count; i++) {
        
        UIButton * imageBtn = [[UIButton alloc] initWithFrame:CGRectMake(_widthView * i, 0, _widthView, _hightView)];
        imageBtn.tag = 900 + i;
        [imageBtn addTarget:self action:@selector(imageBtnClick:) forControlEvents:UIControlEventTouchUpInside];
        [self.mainScrollView addSubview:imageBtn];
    }
}

#pragma mark - 初始化滚动视图

-(UIScrollView *)mainScrollView{
    if (!_mainScrollView) {
        _mainScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, _widthView, _hightView)];
        _mainScrollView.contentSize = CGSizeMake(_widthView * _imagesNameArray.count, _hightView);
        _mainScrollView.pagingEnabled = YES;
        _mainScrollView.showsHorizontalScrollIndicator = NO;
        _mainScrollView.showsVerticalScrollIndicator = NO;
        _mainScrollView.delegate = self;
        _mainScrollView.bounces = NO;
    }
    return _mainScrollView;
}

#pragma mark - 创建UIImageView
-(void)createImageView{
    
    for (int i = 0; i <= _imagesNameArray.count; i++) {
        
        UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(_widthView * i, 0, _widthView, _hightView)];
        
        if (i == _imagesNameArray.count) {
            
            [self addImageToImageViewWithImageView:imageView WithIndex:0];
            
        }else{
            
            [self addImageToImageViewWithImageView:imageView WithIndex:i];
        }

        [self.mainScrollView addSubview:imageView];

    }
}

#pragma mark - 加载网络图片或者本地图片
-(void)addImageToImageViewWithImageView:(UIImageView *)imageView WithIndex:(NSInteger)index{
    [imageView setImage:[UIImage imageNamed:_imagesNameArray[index]]];
}

-(void)imageBtnClick:(UIButton *)btn{
    if (self.block) {
        self.block((btn.tag - 900) == self.imagesNameArray.count? 0:(btn.tag - 900));
    }
}

#pragma mark - 添加PageControl
-(UIPageControl *)imageViewPageControl{
    if (!_imageViewPageControl) {
        _imageViewPageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0,_hightView - 20, _widthView, 20)];
        _imageViewPageControl.numberOfPages = _imagesNameArray.count;
        _imageViewPageControl.pageIndicatorTintColor = [UIColor whiteColor];
        _imageViewPageControl.currentPageIndicatorTintColor = [UIColor redColor];
        _imageViewPageControl.currentPage = _currentPage;
    }
    return _imageViewPageControl;
}


-(void)changeOffset{
    
    if (self.mainScrollView.contentOffset.x / _widthView ==  _imagesNameArray.count ) {
        
        self.imageViewPageControl.currentPage = 0;
        [self.mainScrollView setContentOffset:CGPointMake(0, 0) animated:NO];
        
    }else{
        
        [self.mainScrollView setContentOffset:CGPointMake(self.mainScrollView.contentOffset.x + _widthView, 0) animated:YES];
        
    }
}
#pragma mark - UIScollerView 代理

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    
    NSInteger currentPageNum = (self.mainScrollView.contentOffset.x / _widthView) ;
    if (self.mainScrollView.contentOffset.x / _widthView == _imagesNameArray.count ) {
        
        self.imageViewPageControl.currentPage = 0;
        [self.mainScrollView setContentOffset:CGPointMake(0, 0) animated:NO];
        
    }else{
        
        self.imageViewPageControl.currentPage = currentPageNum;
        
    }
    
}
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
    
    [self colseTimer];
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView{
    
    [self startTimer];
}
#pragma mark --- 开始计时
-(void)startTimer{
    
    if (_timer == nil) {
        _timer = [NSTimer scheduledTimerWithTimeInterval:_scrollInterval target:self selector:@selector(changeOffset) userInfo:nil repeats:YES];
        [[NSRunLoop mainRunLoop]addTimer:_timer forMode:NSRunLoopCommonModes];
    }
}

#pragma mark --- 停止计时
-(void)colseTimer
{
    if (self.timer) {
        [self.timer invalidate];
        self.timer = nil;
    }
}

-(void)dealloc{
    NSLog(@"WJImageScrollView释放");
}
@end

 使用方法

-(void) addWJImageScrollView{
    
    //获取要显示的位置
    CGRect screenFrame = [[UIScreen mainScreen] bounds];
    
    CGRect frame = CGRectMake(10, 160, screenFrame.size.width - 20, 200);
    
    NSArray *imageArray = @[@"001.jpg", @"002.jpg", @"003.jpg", @"004.jpg", @"005.jpg"];
    
    //初始化控件
    self.imageViewDisplay = [WJImageScrollView wjImageScrollViewWithFrame:frame WithImages:imageArray];
    
    //设定轮播时间
    self.imageViewDisplay.scrollInterval = 2;
    
    //把该视图添加到相应的父视图上
    [self.view addSubview:self.imageViewDisplay];
    
    [self.imageViewDisplay addTapEventForImageWithBlock:^(NSInteger imageIndex) {
        NSLog(@"点击了------%zd",imageIndex);
    }];
    
}

能解决问题的不好的方法释放view

-(void)dealloc{
    NSLog(@"释放");
    [self.imageViewDisplay.timer invalidate];
    self.imageViewDisplay.timer = nil;
}
原文地址:https://www.cnblogs.com/WJJ-Dream/p/5786979.html