UIScrollView图片循环轮播
来源:互联网 发布:个人收支软件免费 编辑:程序博客网 时间:2024/05/08 04:56
实现无限滚动视图的方法大体上分为俩种,一种是利用collectionView实现无限滚动,因为collectionView本身存在着复用的问题,所以不用担心内存的消耗问题,就是使用的时候代码相对比较多一点,这里着重介绍第二种,也就是UIScrollView的实现方法。
假如我们现在要显示5张图片,最简单的就是我们直接创建5+2个,也就是7个imageView,而我们的存放顺序为,图片5,图片1,图片2,图片3,图片4,图片5,图片1。默认显示第2张(图片1),一直向右滑动到第6张(图片5),再向右滑动显示第7张(图片1)显示完成后,将UIScrollView的contentOffset设置到第2个imageView上(图片1),这时候便可继续向右滑动实现循环的效果;同理,向左滑动时,滑动到第1张(图片5)后,将UIScrollView的contentOffset设置到第6个imageView上(图片5),这样便可以继续向左滑动实现循环效果。
性能优化:
上面的那种方法,需要我们创建n+2个imageView,而这些imageView都需要加载到内存中去,所以还有一种简单的方法来实现,只需要创建三个imageView便可以实现无限循环。
实现原理:
比如有5张图片,创建三个imageView,分别展示图片5,图片1,图片2,默认展示第二张(图片1),向左滑动显示第3张(图片2),显示完成后,将scrollView的contentOffset重新设置到中间图片,并根据引用计数+1,重新刷新图片,三个imageView分别展示为,图片1,图片2,图片3,这时候就相当于图片2在中间,图片3在右边。同理再次向右滑动,显示图片第3张(图片3),显示完成后,再将scrollView的contentOffset重新设置到中间图片上面,并根据引用计数+1,重新刷新图片,三个imageView分别展示为图片2,图片3,图片4,这时候就相当于图片3在中间,图片4在右边,依次下去,便可实现无限循环。
注意点:使用循环播放,要处理好下标越界的问题。处理方法就直接写在代码里。
#import <UIKit/UIKit.h>
@interface SZInfiniteLoopScrollView :UIView
/**需要添加的图片数组*/
@property (strong,nonatomic)NSArray *images;
/**控制水平竖直方向的滚动 默认为水平方向 设置为YES时为竖直方向*/
@property (assign,nonatomic,getter=isInfiniteScrollVertical)BOOL infiniteScrollVertical;
/** 图片切换时间 */
@property(nonatomic,assign)CGFloat time;
@end
#import "SZInfiniteLoopScrollView.h"
/** ImageView的个数 */
static intconst ImageViewCount =3;
@interface SZInfiniteLoopScrollView ()<UIScrollViewDelegate>
/* 页码控制器 */
@property (weak, nonatomic, readonly) UIPageControl *pageControl;
@property (weak,nonatomic)UIScrollView *scrollView;
/* 定时器 */
@property (weak,nonatomic)NSTimer *timer;
@end
@implementation SZInfiniteLoopScrollView
//构造方法
- (instancetype)initWithFrame:(CGRect)frame
{
if (self = [superinitWithFrame:frame]) {
//滚动视图
UIScrollView *scrollView = [[UIScrollViewalloc]init];
scrollView.showsHorizontalScrollIndicator =NO;
scrollView.showsVerticalScrollIndicator =NO;
scrollView.pagingEnabled =YES;
scrollView.bounces =NO;
scrollView.delegate =self;
[selfaddSubview:scrollView];
_scrollView = scrollView;
//图片控件
for (int i =0; i<ImageViewCount; i++) {
UIImageView *imageView = [[UIImageViewalloc]init];
[scrollView addSubview:imageView];
}
//页码视图
UIPageControl *pageControl = [[UIPageControlalloc]init];
[selfaddSubview:pageControl];
_pageControl = pageControl;
}
returnself;
}
#pragma mark - 布局子控件
- (void)layoutSubviews
{
[superlayoutSubviews];
//设置frame
_scrollView.frame =self.bounds;
//设置contentSize
if (self.isInfiniteScrollVertical) {//垂直滚动
self.scrollView.contentSize = CGSizeMake(0,ImageViewCount *self.bounds.size.height);
} else {
self.scrollView.contentSize = CGSizeMake(ImageViewCount *self.bounds.size.width,0);
}
//摆放imageView
for (int i =0; i<ImageViewCount; i++) {
UIImageView *imageView =self.scrollView.subviews[i];
if (self.isInfiniteScrollVertical) {
imageView.frame =CGRectMake(0, i *self.scrollView.frame.size.height,
self.scrollView.frame.size.width,self.scrollView.frame.size.height);
} else {
imageView.frame =CGRectMake(i *self.scrollView.frame.size.width,0,
self.scrollView.frame.size.width,self.scrollView.frame.size.height);
}
}
// 设置pageControl
CGFloat pageW =80;
CGFloat pageH =20;
CGFloat pageX =self.scrollView.frame.size.width - pageW;
CGFloat pageY =self.scrollView.frame.size.height - pageH;
self.pageControl.frame =CGRectMake(pageX, pageY, pageW, pageH);
[selfupdateContent];
}
#pragma mark - setter
- (void)setImages:(NSArray *)images
{
_images = images;
//设置页码
self.pageControl.numberOfPages = images.count;
self.pageControl.currentPage = 0;
//设置内容
[selfupdateContent];
//开始定时器
[selfstartTimer];
}
- (void)setTime:(CGFloat)time{
_time = time;
}
#pragma mark - <UIScrollViewDelegate>
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
//计算当前页码(找出当前显示在最中间的imageView)
NSInteger page =0;
CGFloat minDistance =MAXFLOAT;
for (int i =0; i<ImageViewCount; i++) {
UIImageView *imageView =self.scrollView.subviews[i];
CGFloat distance =0;
if (self.isInfiniteScrollVertical) {
distance = ABS(imageView.frame.origin.y - scrollView.contentOffset.y);
} else {
distance = ABS(imageView.frame.origin.x - scrollView.contentOffset.x);
}
if (distance < minDistance) {
minDistance = distance;
page = imageView.tag;
}
}
self.pageControl.currentPage = page;
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[selfstopTimer];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
[selfstartTimer];
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[selfupdateContent];
}
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
[selfupdateContent];
}
#pragma mark - 内容更新
- (void)updateContent
{
//设置图片
for (int i =0; i<ImageViewCount; i++) {
UIImageView *imageView =self.scrollView.subviews[i];
//当前页码
NSInteger index =self.pageControl.currentPage;
if (i ==0) {//左边显示上一页
index--;
} elseif (i ==2) {//右边显示下一页
index++;
}
//越界处理
if (index <0) {
index = self.pageControl.numberOfPages -1;
} elseif (index >=self.pageControl.numberOfPages) {
index = 0;
}
imageView.tag = index;
imageView.image =self.images[index];
}
//设置偏移量在中间
if (self.isInfiniteScrollVertical) {
self.scrollView.contentOffset = CGPointMake(0,self.scrollView.frame.size.height);
} else {
self.scrollView.contentOffset = CGPointMake(self.scrollView.frame.size.width,0);
}
}
#pragma mark - 定时器处理
- (void)startTimer
{
NSTimer *timer = [NSTimertimerWithTimeInterval:self.timetarget:selfselector:@selector(next)userInfo:nilrepeats:YES];
[[NSRunLoopmainRunLoop]addTimer:timerforMode:NSRunLoopCommonModes];
self.timer = timer;
}
- (void)stopTimer
{
[self.timerinvalidate];
self.timer =nil;
}
//下一张图片
- (void)next
{
if (self.isInfiniteScrollVertical) {
[self.scrollViewsetContentOffset:CGPointMake(0,2 * self.scrollView.frame.size.height)
animated:YES];
} else {
[self.scrollViewsetContentOffset:CGPointMake(2 *self.scrollView.frame.size.width,0)
animated:YES];
}
}
//集成图片轮播
#import "ViewController.h"
#import "SZInfiniteLoopScrollView.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
[selfsetupInfiniteScrollView];
}
//图片轮播
- (void)setupInfiniteScrollView{
SZInfiniteLoopScrollView *scrollView = [[SZInfiniteLoopScrollViewalloc]init];
//尺寸
scrollView.frame =CGRectMake(0,0,self.view.frame.size.width,300);
//图片切换时间
scrollView.time =2;
//图片数组
scrollView.images =@[
[UIImageimageNamed:@"img_00"],
[UIImageimageNamed:@"img_01"],
[UIImageimageNamed:@"img_02"],
[UIImageimageNamed:@"img_03"],
[UIImageimageNamed:@"img_04"]
];
[self.viewaddSubview:scrollView];
// //竖直方向的滚动
// SZInfiniteLoopScrollView *scrollView1 = [[SZInfiniteLoopScrollView alloc] init];
//
// scrollView1.frame = CGRectMake(0, 250, self.view.frame.size.width, 100);
// scrollView1.images = @[
// [UIImage imageNamed:@"img_00"],
// [UIImage imageNamed:@"img_01"],
// [UIImage imageNamed:@"img_02"],
// [UIImage imageNamed:@"img_03"],
// [UIImage imageNamed:@"img_04"]
// ];
//
// [self.view addSubview:scrollView1];
//设置竖直方向滚动
// scrollView1.infiniteScrollVertical = YES;
}
@end
- UIScrollView图片循环轮播
- [IOS]通过UIPageControl+UIScrollView实现图片循环轮播
- UIScrollView实现图片轮播
- UIScrollView配合定时器和手动实现图片轮播无限循环
- UIScrollView控件实现图片轮播
- UIScrollView控件实现图片轮播
- UI028---UIScrollView控件实现图片轮播
- UIScrollView控件实现图片轮播
- UIScrollView控件实现图片轮播
- 轮播器(一)--UIScrollView实现图片轮播
- IOS开发实现 UIScrollView 的循环轮播功能
- UIscrollView图片滚动循环
- UIScrollView(图片循环滚动)
- UIScrollView(循环滚动图片)
- UI基础第十三弹: UIScrollView控件实现图片轮播
- UIScrollView,UIPageControl,UIImageView 实现图片轮播的效果
- android 图片轮播(自动循环轮播)
- Android实现Banner图片循环轮播
- 需要研究的网站
- Maximum Depth of Binary Tree
- 继承小结
- 这可能是退出Activity最优雅的方式了
- PRM详解
- UIScrollView图片循环轮播
- 安卓学习笔记之———五大布局
- 异常小结
- C语言关键字之volatile的使用
- 最佳时间买入卖出股票 Best Time to Buy and Sell Stock LeetCode
- Unity+Vuforia SDKAR开发系列教程--2.2 Vuforia sdk for unity
- Android开发常用工具类之图像处理
- HihoCoder]#1375 : 沙漠之旅
- 使用caffe中的imagenet对自己的图片进行分类训练(超级详细版)