01.轮播图之四 :imageViews(2 或者 3 个imageview) 轮播
首先说下 3 个imageView的轮播,这个逻辑分析起来 比较简单,
先上传个图片吧:::::

主要分析起来,核心就是这样 :新的图片永远是加在中间ImageView上的,下一轮的第一张图片,是上一轮的第二张图片,这样就可以形成一个无缝滚动了,
只是切换了数据的逻辑。难理解就算了,看代码才容易懂………………
.h 的声明文件
@interface ImageViewShuffling : UIView @property (nonatomic,strong)NSArray *array; @end
.m 的具体实现,这里是理解这个逻辑的好地方————————
@interface ImageViewShuffling ()<UIScrollViewDelegate> @property (nonatomic,strong)UIScrollView *scrollView; @property (nonatomic,strong)UIImageView *leftImageView;
@property (nonatomic,strong)UIImageView *centerImageView;
@property (nonatomic,strong)UIImageView *rightImageView; @property (nonatomic,assign)NSInteger currentIndex; @end @implementation ImageViewShuffling
@synthesize array = _array; -(instancetype)initWithFrame:(CGRect)frame{ if (self == [super initWithFrame:frame]) {
self.currentIndex = ;
}
return self;
} -(UIScrollView*)scrollView{ if (_scrollView == nil) {
CGRect scrollRect = CGRectMake(, , self.frame.size.width, self.frame.size.height);
_scrollView = [[UIScrollView alloc]initWithFrame:scrollRect];
[self addSubview:_scrollView];
_scrollView.pagingEnabled = YES;
_scrollView.delegate = self;
}
return _scrollView;
} -(void)setArray:(NSArray *)array{ NSAssert(array.count != , @"传入的滚动数组是 空的");
_array = array;
[self initImageViews];
} -(void)initImageViews{ self.leftImageView = [[UIImageView alloc]initWithFrame:CGRectMake(, , self.frame.size.width, self.frame.size.height)];
self.centerImageView = [[UIImageView alloc]initWithFrame:CGRectMake(self.frame.size.width, , self.frame.size.width, self.frame.size.height)];
self.rightImageView = [[UIImageView alloc]initWithFrame:CGRectMake(self.frame.size.width*, , self.frame.size.width, self.frame.size.height)];
self.leftImageView.contentMode = UIViewContentModeScaleAspectFit;
self.centerImageView.contentMode = UIViewContentModeScaleAspectFit;
self.rightImageView.contentMode = UIViewContentModeScaleAspectFit; [self.scrollView addSubview:self.leftImageView];
[self.scrollView addSubview:self.centerImageView];
[self.scrollView addSubview:self.rightImageView];
/*
千万不要忘记设置这里
*/
self.scrollView.contentSize = CGSizeMake(self.frame.size.width * , );
self.scrollView.contentOffset = CGPointMake(self.frame.size.width , ); [self setImageWith:self.currentIndex];
} -(void)setImageWith:(NSInteger)integer{ self.centerImageView.backgroundColor = (UIColor*)self.array[integer];
self.leftImageView.backgroundColor = (UIColor*)self.array[(integer - + self.array.count)%(self.array.count)];
self.rightImageView.backgroundColor = (UIColor*)self.array[(integer + )%(self.array.count)];
}
/**
理解此处,你就能理解整个逻辑实现
*/
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ if (scrollView == self.scrollView) { if (scrollView.contentOffset.x > self.frame.size.width ) {//右滑 self.currentIndex = (self.currentIndex+) % (self.array.count); }else if(scrollView.contentOffset.x < self.frame.size.width ){//左滑 self.currentIndex = (self.currentIndex - + self.array.count)%(self.array.count); }else{// }
[self setImageWith:self.currentIndex];
self.scrollView.contentOffset = CGPointMake(self.frame.size.width , );
}
}
上面就是 3张图实现的 轮播图,童叟无欺………………
调用::::
-(void)prepareImageViewShuffling{
ImageViewShuffling *imageViewShuffling = [[ImageViewShuffling alloc]initWithFrame:CGRectMake(, , self.view.frame.size.width -, )];
[self.view addSubview:imageViewShuffling];;
imageViewShuffling.array = self.arr;
}
********************************************************************************
弄懂了上面这个,相信下面介绍这个两张图片实现的轮播 ,对你就是小case
他就是对上面3张图片的简化…………
看完上面的逻辑,理解后发现, 左侧,或者右侧的 imageView 始终有一个是备用的,就像实现的代码一样,你不是向左就是向右滑动;
根据这个理由,就想到了这个,实时检测scroll 的滚动方向,这样就可以实现:一个主要显示的imageView,和一个 待显示的imageView……
越说越啰嗦,直接撸代码……
.h 文件
@interface ImageView2Shuffling : UIView
@property (nonatomic,strong)NSArray *array; @end
.m 实现文件,逻辑变化不大
@interface ImageView2Shuffling ()<UIScrollViewDelegate> @property (nonatomic,strong)UIScrollView *scrollView;
@property (nonatomic,strong)UIImageView *currentImageView;
@property (nonatomic,strong)UIImageView *otherImageView;
@property (nonatomic,assign)NSInteger currentIndex;
/*
这个是检测滚动方向的
*/
@property (nonatomic,strong)NSString *directionString;
@end @implementation ImageView2Shuffling
@synthesize array = _array; -(instancetype)initWithFrame:(CGRect)frame{ if (self == [super initWithFrame:frame]) {
self.currentIndex = ;
self.directionString = [[NSString alloc]init];
}
return self;
} -(UIScrollView*)scrollView{ if (_scrollView == nil) {
CGRect scrollRect = CGRectMake(, , self.frame.size.width, self.frame.size.height);
_scrollView = [[UIScrollView alloc]initWithFrame:scrollRect];
[self addSubview:_scrollView];
_scrollView.pagingEnabled = YES;
_scrollView.delegate = self;
}
return _scrollView;
} -(void)setArray:(NSArray *)array{ NSAssert(array.count != , @"传入的滚动数组是 空的");
_array = array;
[self initImageViews];
} -(void)initImageViews{
/*
这里写个空 frame 的imageview
*/
self.otherImageView = [[UIImageView alloc]init];
[self.scrollView addSubview:self.otherImageView]; self.currentImageView = [[UIImageView alloc]initWithFrame:CGRectMake(self.frame.size.width, , self.frame.size.width, self.frame.size.height)];
self.currentImageView.contentMode = UIViewContentModeScaleAspectFit;
[self.scrollView addSubview:self.currentImageView]; self.scrollView.contentSize = CGSizeMake(self.frame.size.width * , );
self.scrollView.contentOffset = CGPointMake(self.frame.size.width , ); [self setImageWith:self.currentIndex];
} -(void)setImageWith:(NSInteger)integer{ self.currentImageView.backgroundColor = (UIColor*)self.array[integer];
} -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ if (scrollView == self.scrollView) { self.directionString = @""; if (scrollView.contentOffset.x > self.frame.size.width ) {//右滑 self.currentIndex = (self.currentIndex+) % (self.array.count); }else if(scrollView.contentOffset.x < self.frame.size.width ){//左滑 self.currentIndex = (self.currentIndex - + self.array.count)%(self.array.count);
}else{//
}
[self setImageWith:self.currentIndex];
self.scrollView.contentOffset = CGPointMake(self.frame.size.width , );
}
} /*
这里集中了些 修改的代码
检测滚动方向,改变otherImageview 的位置,和颜色
*/
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{ if (scrollView == self.scrollView) { if (scrollView.contentOffset.x > self.frame.size.width ) {//右滑 [self refreshOtherImageViewWithDirectionString:@"right"];
}else if(scrollView.contentOffset.x < self.frame.size.width ){//左滑 [self refreshOtherImageViewWithDirectionString:@"left"];
}else{//
}
}
} -(void)refreshOtherImageViewWithDirectionString:(NSString*)direction{ if ([self.directionString isEqualToString:direction]) {
return ;
}
self.directionString = direction; CGRect frame; NSInteger integer;
if ([direction isEqualToString:@"right"]) { integer = (self.currentIndex+) % (self.array.count);
frame = CGRectMake(self.frame.size.width*, , self.frame.size.width, self.frame.size.height);
}else{ //if "left" integer = (self.currentIndex - + self.array.count)%(self.array.count);
frame = CGRectMake(, , self.frame.size.width, self.frame.size.height);
}
self.otherImageView.backgroundColor = (UIColor*)self.array[integer];
self.otherImageView.frame = frame;
}
写到这里,应该可以了,简单来讲,就是用一个direction 替换了一个imageview ,应该算减少了UI 的开销,增加了逻辑判断和运算
调用::::
-(void)prepareImageView2Shuffling{
ImageView2Shuffling *imageView2Shuffling = [[ImageView2Shuffling alloc]initWithFrame:CGRectMake(, , self.view.frame.size.width -, )];
[self.view addSubview:imageView2Shuffling];;
imageView2Shuffling.array = self.arr;
}
突然感觉要超额完成任务的节拍,为自己加油点赞………………
01.轮播图之四 :imageViews(2 或者 3 个imageview) 轮播的更多相关文章
- 纯js轮播图练习-2,js+css旋转木马层叠轮播
基于css3的新属性,加上js的操作,让现在js轮播图花样越来越多. 而现在出现的旋转木马层叠轮播的轮播图样式,却是得到了很多人都喜爱和投入使用. 尤其是在各大软件中,频繁的出现在大家的眼里,在web ...
- 从零开始,搭建博客系统MVC5+EF6搭建框架(5),博客详情页、留言、轮播图管理、右侧统计博文
一.博客系统进度回顾 上一遍博客介绍到,系统已经实现到了发布以及前台布局展示,接下来就是实现一些,详情页,留言.轮播图管理.右侧博文统计信息实现. 二.博客系统详情页实现 2.1先来看看详情页展示的效 ...
- 2.bootstrap练习笔记-轮播图
bootstrap练习笔记-轮播图 1.要使用轮播图,首先要将其放在一个主div里面 设置id为myCaroysel class为carousel slide 设置id是标识这个div是轮播图,等到l ...
- Android开发之ViewPager实现轮播图(轮播广告)效果的自定义View
最近开发中需要做一个类似京东首页那样的广告轮播效果,于是采用ViewPager自己自定义了一个轮播图效果的View. 主要原理就是利用定时任务器定时切换ViewPager的页面. 效果图如下: 主页面 ...
- android 轮播图
轮播图是很常用的一个效果 核心功能已经实现 没有什么特殊需求 自己没事研究的 所以封装的不太好 一些地方还比较糙 为想要研究轮播图的同学提供个参考 目前测试图片为mipmap中的图片 没有写从网络加载 ...
- 原生js实现简单移动端轮播图
最近项目不是很忙,自己就用原生js写了一个简单的移动端轮播图的小demo,可实现自动轮播和手势滑动轮播,然后就把它记录到个人博客里.还有很多不足的地方,希望多多指出,以便改进. 1.代码部分 分为四个 ...
- Android轮播图
轮播图是很常用的一个效果 核心功能已经实现 没有什么特殊需求 自己没事研究的 所以封装的不太好 一些地方还比较糙 为想要研究轮播图的同学提供个参考目前测试图片为mipmap中的图片 没有写从网络加载图 ...
- 浅谈轮播图(原生JavaScript实现)
现在各种轮播图插件,玲琅满目,用起来也非常方便,通常只需要选择元素然后传入参数就可以了.但是,和授人以鱼不如授人以渔一样的道理,不管怎样最基本的轮播图原理还是应当掌握的.这样不仅有利于我们自己写出来满 ...
- 原生JS实现简易轮播图
原生JS实现简易轮播图(渐变?) 最近做网页总是会用到轮播图,我就把之前写的轮播图单独拿出来吧,如果有...如果真的有人也需要也可以复制去用用啊..哈~.. window.onload = funct ...
随机推荐
- python - threading.local
import time import threading try: # 线程和协程都可处理 import greenlet get_ident = greenlet.getcurrent except ...
- Linux 介绍与安装
- yum安装mysql(指定版)
首先需要删除已经存在的mysql,不然后面会报错: 快速删除: yum remove mysql mysql-server mysql-libs mysql-server 查找残余文件: rpm -q ...
- [USACO]骑马修栅栏 Riding the Fences
题目链接 题目简述:欧拉回路,字典序最小.没什么好说的. 解题思路:插入边的时候,使用multiset来保证遍历出出答案的字典序最小. 算法模板:for(枚举边) 删边(无向图删两次) 遍历到那个点 ...
- sql server 时间处理函数 datediff() 和getdate()
一: DATEDIFF() 定义和用法 DATEDIFF() 函数返回两个日期之间的时间. 语法 DATEDIFF(datepart,startdate,enddate) startdate 和 en ...
- 利用 BackgroundService 固定时间间隔执行某动作
继承 BackgroundService 类: 为什么会写这个东西呢?本人在写消息队列的时候思考过一个问题——比如,每5秒从队列里面取一条消息(一条消息里面又包含了1000条数据),要把这1000条数 ...
- Python多线程笔记(二)
Lock对象 原语锁(互斥锁)是一个同步原语,状态是"已锁定"或者"未锁定"之一.两个方法acquire()和release()用于修改锁的状态.如果状态为已锁 ...
- Spring Cloud Gateway(三):网关处理器
1.Spring Cloud Gateway 源码解析概述 API网关作为后端服务的统一入口,可提供请求路由.协议转换.安全认证.服务鉴权.流量控制.日志监控等服务.那么当请求到达网关时,网关都做了哪 ...
- BAT资深工程师由浅入深分析Tp5&Tp6底层源码☆
第1章 课程简介 本章主要让大家知道本套课程的主线, 导学内容,如何学习源码等,看完本章要让小伙伴觉得这个是必须要掌握的,并且对加薪有很大的帮助. 第2章 [TP5灵魂]自动加载Loader 深度分析 ...
- 【转载】Hadoop集群各部分常用端口号
hadoop集群的各部分一般都会使用到多个端口,有些是daemon之间进行交互之用,有些是用于RPC访问以及HTTP访问.而随着hadoop周边组件的增多,完全记不住哪个端口对应哪个应用,特收集记录如 ...