//TableViewController .m中
// TestTableViewController.m
// 图片轮播器
//
// Created by 张德华 on 5/17/16.
// Copyright © 2016 张德华. All rights reserved.
//
#import "TestTableViewController.h"
#import "ScrollModel.h"
#import "ScrollView.h"
@interface TestTableViewController ()
@property (nonatomic,strong)NSArray *dataArray;
@end
@implementation TestTableViewController
#pragma mark - 懒加载
- (NSArray *)dataArray{
if(nil == _dataArray){
//获取路径
NSString *path = [[NSBundle mainBundle]pathForResource:@"ad.plist" ofType:nil];
//读取
NSArray *tempArray = [NSArray arrayWithContentsOfFile:path];
//创建可变数组
NSMutableArray *mutable = [NSMutableArray array];
//遍历
for (NSDictionary *dict in tempArray) {
ScrollModel *model = [ScrollModel scrollModelWithDict:dict];
//数据模型 存入数组
[mutable addObject:model];
}
_dataArray = mutable;
}
return _dataArray;
}
- (void)viewDidLoad {
[super viewDidLoad];
//实例化滚动视图
ScrollView *scrollView = [[ScrollView alloc]initWithFrame:CGRectMake(0, 0, 375, 260)];
//传递数据
scrollView.dataArray = self.dataArray;
//添加到屏幕
self.tableView.tableHeaderView = scrollView;
}
@end
//数据模型.h中
// ScrollModel.h
// 图片轮播器
//
// Created by 张德华 on 5/17/16.
// Copyright © 2016 张德华. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface ScrollModel : NSObject
@property (nonatomic,copy) NSString *imgsrc;
@property (nonatomic,copy) NSString *title;
//对象方法
- (instancetype)initWithDict:(NSDictionary *)dict;
//类方法
+ (instancetype)scrollModelWithDict:(NSDictionary *)dict;
@end
//数据模型 .m中
// ScrollModel.m
// 图片轮播器
//
// Created by 张德华 on 5/17/16.
// Copyright © 2016 张德华. All rights reserved.
//
#import "ScrollModel.h"
@implementation ScrollModel
//对象方法
- (instancetype)initWithDict:(NSDictionary *)dict{
if (self = [super init]) {
[self setValuesForKeysWithDictionary:dict];
}
return self;
}
//类方法
+ (instancetype)scrollModelWithDict:(NSDictionary *)dict{
return [[self alloc]initWithDict:dict];
}
@end
//自定义View .h中
// ScrollView.h
// 图片轮播器
//
// Created by 张德华 on 5/17/16.
// Copyright © 2016 张德华. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface ScrollView : UIView
//接收外部传递的数据
@property (nonatomic,strong) NSArray *dataArray;
@end
//自定义View .m中
// ScrollView.m
// 图片轮播器
//
// Created by 张德华 on 5/17/16.
// Copyright © 2016 张德华. All rights reserved.
//
#import "ScrollView.h"
#import "ScrollModel.h"
#define kViewSize ([UIScreen mainScreen].bounds.size)
#define kScrollSize (_scrollView.frame.size)
@interface ScrollView () <UIScrollViewDelegate>
//滚动视图
@property (nonatomic,weak) UIScrollView *scrollView;
//分页控制器
@property (nonatomic,weak) UIPageControl *pageControl;
//显示文本
@property (nonatomic,weak) UILabel *titleLabel;
//定时器
@property (nonatomic,weak) NSTimer *timer;
@end
@implementation ScrollView
#pragma mark - 初始化界面
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]){
//初始化scrollView
[self initScrollView];
//初始化pageControl
[self initPageControl];
//初始化titleLabel
[self initTitleLabel];
//添加定时器
[self setupTimer];
}
return self;
}
#pragma mark - 初始化scrollView
- (void)initScrollView{
//实例化scrollView
UIScrollView *scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0,0, kViewSize.width, 260)];
//关联属性
self.scrollView = scrollView;
//添加到当前view
[self addSubview:scrollView];
//设置代理
scrollView.delegate = self;
}
#pragma mark - 初始化pageControl
- (void)initPageControl{
//实例化pageControl
UIPageControl *pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(kScrollSize.width/3*2+5, kScrollSize.height-30, kScrollSize.width/3-10, 20)];
//关联属性
self.pageControl = pageControl;
//添加到当前view
[self addSubview:pageControl];
//当前页颜色
pageControl.currentPageIndicatorTintColor = [UIColor yellowColor];
//非当前页颜色
pageControl.pageIndicatorTintColor = [UIColor grayColor];
//当前页码
pageControl.currentPage = 0;
}
#pragma mark - 初始化titleLabel
- (void)initTitleLabel{
//实例化titleLabel
UILabel *titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(5, kScrollSize.height-30, kScrollSize.width/3*2, 20)];
//关联属性
self.titleLabel = titleLabel;
//添加到当前view
[self addSubview:titleLabel];
//设置文本颜色
titleLabel.textColor = [UIColor whiteColor];
//设置字体大小
titleLabel.font = [UIFont systemFontOfSize:14];
}
#pragma mark - 添加定时器
- (void)setupTimer{
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2
target:self
selector:@selector(changeData)
userInfo:nil
repeats:YES];
self.timer = timer;
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:timer forMode:NSRunLoopCommonModes];
}
//定时器调用方法
- (void)changeData{
//得到当前页码
NSInteger currentPage = _pageControl.currentPage;
//判断
if (currentPage == _dataArray.count-1){
//图片显示到最后一张,跳回第一张
currentPage = 0;
} else {
//图片没有显示到最后一张,跳到下一张
currentPage++;
}
//页码传递回去,改变页码显示
_pageControl.currentPage = currentPage;
//显示页码对应的图片 (带有动画效果)
[_scrollView setContentOffset:CGPointMake(kScrollSize.width * currentPage, 0) animated:YES];
//显示页码对应的文本内容
ScrollModel *model = _dataArray[currentPage];
_titleLabel.text = model.title;
}
#warning 只有拿到数据才能进行设置,否则只能做初始化操作
#pragma mark - 重写数组属性set方法 接收外部传进来的数据 并在这里对界面进行设置 (拿到的是存了模型的数组)
- (void)setDataArray:(NSArray *)dataArray{
_dataArray = dataArray;
//设置scrollView界面
[self setupScroll];
//设置分页
[self setupPageControl];
//设置初始显示文本
[self setupInitTitle];
}
#pragma mark - 设置滚动视图
- (void)setupScroll{
for(int i = 0; i < _dataArray.count; i++){
//拿到数据模型
ScrollModel *model = _dataArray[i];
//拼接图片名称
NSString *imageString = [NSString stringWithFormat:@"%@",model.imgsrc];
//设置x
CGFloat imageX = kScrollSize.width * i;
//实例化imageView
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(imageX, 0, kScrollSize.width, kScrollSize.height)];
//实例化image
UIImage *image = [UIImage imageNamed:imageString];
//添加图片到imageView
imageView.image = image;
//添加到scrollView
[_scrollView addSubview:imageView];
}
//打开分页效果
_scrollView.pagingEnabled = YES;
//滚动范围
[_scrollView setContentSize:CGSizeMake(kScrollSize.width * _dataArray.count,0)];
}
#pragma mark - 设置分页控制器
- (void)setupPageControl{
//总页数
_pageControl.numberOfPages = _dataArray.count;
}
#pragma mark - 设置初始显示文本
- (void)setupInitTitle{
ScrollModel *model = _dataArray[0];
_titleLabel.text = model.title;
}
#pragma mark - 代理方法 --> 停止滚动后调用
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
//设置当前图片对应的页码
_pageControl.currentPage = _scrollView.contentOffset.x / kScrollSize.width;
//设置显示文本
ScrollModel *model = self.dataArray[_pageControl.currentPage];
_titleLabel.text = model.title;
}
#pragma mark - 代理方法 --> 开始拖拽时调用 (手触摸的那一刻)
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
//关闭定时器
[_timer invalidate];
}
#pragma mark - 代理方法 --> 停止拖拽时调用 (手离开的那一刻)
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
//开启定时器
[self setupTimer];
}
/**一定要释放*/
- (void)dealloc{
[_timer invalidate];
_timer = nil;
}
@end
实现步骤:
1.创建ScrollView : UIView (这个ScrollView类相当于一个Viwe视图,可以在上面添加控件)
2.在控制器中导入ScrollView类,并在ViewDidLoad中实例化,添加到当前控制器的View上
3.创建数据模型类ScrollModel : NSObject (对轮播器上要显示的数据进行懒加载)
4.在控制器中导入ScrollModel类,并实现懒加载方法,将数据模型保存到数组中
5.在ScrollView类中实现在控制器中创建的ScrollView对象的初始化方法 -(initWithFrame:)
6.在初始化方法中,需要初始化的有:滚动视图,分页控制器,初始显示文本
7.在ScrollView.h中定义数组,用来接收控制器传递过来的存了模型的数组数据
8.在控制器中给ScrollView对象的数组属性赋值 (赋值后ScrollView类中通过重写数组属性的set方法就接收到了数据)
9.在ScrollView.m中重写数组属性的set方法,接收传递进来的数据,并赋值给自己(数组属性)
10.ScrollView类中有了数据后,就可以对界面上的控件进行设置
1.设置滚动视图的图片 (拼接图片添加到scrollView)
2.设置pageControl (初始化的时候没有数据,不能设置总"点"数,只能在拿到数据后在这里设置)
3.设置初始显示文本 (初始化的时候没有数据,所以不能设置初始显示文本,要在这里拿到数据后再进行设置)
11.设置定时器,让滚动视图自动滚动
12.设置完成后调用代理方法,监听用户的操作,做出相应操作(开始拖拽:关闭定时器,停止拖拽:打开定时器,图片停止滚动:设置页码和显示文本)
ad.plist文件内容