一个简单的利用UIScrollView 实现的无线滚动banner,下面的代码实现,因为封装问题,对两个及一下的view 支持出了一点问题(view是传参进来的,不可以生成两份),但是原理是正确的,智者见智吧

先说一下原理,看下面的图

第一种原理       , 本文是用的原理

为了方便看懂,这里做了2张动图

下面是解析图

第二种原理

原理清晰了,代码附上,有问题可以留言,会尽快回复,

.h文件

 //
// MyUIScrollView.h
// UIscrollView
//
// Created by Ibokan on 15/8/25.
// Copyright (c) 2015年 Crazy凡. All rights reserved.
// #import <UIKit/UIKit.h> @interface MyUIScrollView : NSObject
@property (nonatomic,strong)UIScrollView *scrollView; //滚动框
@property (nonatomic,strong)UILabel * label;//titlelabel,要想显示图片title 需要先将label 贴到view中,并且settitle,如果不调用settitle 方法,则不会显示
@property (nonatomic,strong)UIPageControl * pageControl;//显示小点
//以上三个控件都需要调用 [self.view addSubView:]方法,否则不会显示
@property BOOL isCarousel;//是否有动画 默认有 View 数量为一张 会关闭动画
@property double delay;//动画播放速度 默认1.5 最小应 > 0.2
- (instancetype)initWithFrame:(CGRect)frame ViewNum:(int)num Margin:(int)margin;//frame是全部尺寸,num是View数量,margin是内容和外边框距离
- (instancetype)initWithFrame:(CGRect)frame ViewNum:(int)num MarginV:(int)marginV MarginH:(int)marginH;//垂直和水平边距
- (instancetype)initWithFrame:(CGRect)frame ViewNum:(int)num MarginT:(int)marginTop MarginR:(int)marginRight MarginB:(int)marginBottom MarginL:(int)marginLeft;//上右下左边距
- (void)setSubView:(NSArray *)viewArray;//填充view,最好多于2个,数量为2的请复制成4个,数量为1的将不允许滑动,2个以上的不需要做特殊处理
- (void)setTitle:(NSArray *)title;
@end

.m 文件

 //
// MyUIScrollView.m
// UIscrollView
//
// Created by Ibokan on 15/8/25.
// Copyright (c) 2015年 Crazy凡. All rights reserved.
// #import "MyUIScrollView.h" @interface MyUIScrollView () <UIScrollViewDelegate>
@property (nonatomic,strong)NSTimer * timer;
@property (nonatomic,strong)NSMutableArray *labeltitle;
@property (nonatomic,strong)NSMutableArray *viewArray;
@property (nonatomic,strong)NSMutableArray *titleArray;
@property int indexc;
@property BOOL isOne; //记录图片是否只有一张
@end @implementation MyUIScrollView
- (instancetype)initWithFrame:(CGRect)frame ViewNum:(int)num Margin:(int)margin
{
[self makeWF:frame VN:num MT:margin MR:margin MB:margin ML:margin];
return self;
}
- (instancetype)initWithFrame:(CGRect)frame ViewNum:(int)num MarginV:(int)marginV MarginH:(int)marginH
{
[self makeWF:frame VN:num MT:marginV MR:marginH MB:marginV ML:marginH];
return self;
}
- (instancetype)initWithFrame:(CGRect)frame ViewNum:(int)num MarginT:(int)marginTop MarginR:(int)marginRight MarginB:(int)marginBottom MarginL:(int)marginLeft;
{
[self makeWF:frame VN:num MT:marginTop MR:marginRight MB:marginBottom ML:marginLeft];
return self;
}
- (void) makeWF:(CGRect)frame VN:(int)num MT:(int)marginT MR:(int)marginR MB:(int)marginB ML:(int)marginL
{
_isOne = num == ? YES : NO ;
self.label = [[UILabel alloc] initWithFrame: CGRectMake(,frame.size.height-,frame.size.width,)];
self.label.textAlignment = NSTextAlignmentCenter;//label 初始化
self.pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(frame.size.width - num * ,frame.size.height-,num * , )];
self.pageControl.numberOfPages = num;
self.indexc = ;
num = ;
self.scrollView = [[UIScrollView alloc]initWithFrame:frame];
self.scrollView.pagingEnabled = YES;
self.scrollView.delegate = self;
self.scrollView.contentSize = CGSizeMake(frame.size.width * num , frame.size.height);
int i = ;
while(i < num){
UIView *v = [[UIView alloc]initWithFrame:CGRectMake(i * frame.size.width + marginL, marginT, frame.size.width - marginL - marginR, frame.size.height - marginT - marginB)];
v.clipsToBounds = YES;
[self.scrollView addSubview:v];
i++;
}
CGPoint point = CGPointMake(frame.size.width,);
self.scrollView.contentOffset = point;
self.scrollView.showsHorizontalScrollIndicator = NO;
self.isCarousel = YES;//默认自动交换
self.isCarousel ? self.timer = [NSTimer scheduledTimerWithTimeInterval: target:self selector:@selector(autochange) userInfo:nil repeats:YES] : nil;
}
- (int)checkindex:(int)temp
{
return (temp < ? temp = (int)(self.viewArray.count -) : (temp == (int)(self.viewArray.count) ? : temp));
}
- (void)autochange//自动切换
{
_isOne ? nil : [UIView animateWithDuration:(self.delay > 0.2 ? self.delay : 1.5 ) animations:^{ self.scrollView.contentOffset = CGPointMake( self.scrollView.frame.size.width * - , ); } completion:^(BOOL finished) { self.scrollView.contentOffset = CGPointMake( self.scrollView.frame.size.width * , ); }];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
self.scrollView.contentOffset = _isOne ? CGPointMake(self.scrollView.frame.size.width,) : self.scrollView.contentOffset ;// 只有一张图,强行不允许移动
if((int)self.scrollView.contentOffset.x == )
{
self.indexc = [self checkindex:--self.indexc];
[self changeimg];
}
if(fabs(self.scrollView.contentOffset.x - * self.scrollView.frame.size.width) < 1e-)
{
self.indexc = [self checkindex:++self.indexc];
[self changeimg];
}
}
- (void)changeimg
{
self.scrollView.contentOffset = CGPointMake(self.scrollView.frame.size.width,);
[self.scrollView.subviews[] addSubview:_viewArray[[self checkindex:(self.indexc-)]]];
[self.scrollView.subviews[] addSubview:_viewArray[[self checkindex:(self.indexc+)]]];
[self.scrollView.subviews[] addSubview:_viewArray[self.indexc]];
self.pageControl.currentPage = self.indexc;
_labeltitle ? [self.label setText:_labeltitle[self.indexc]]:nil;
}
- (void)setSubView:(NSArray *)viewArray
{
_viewArray = [[NSMutableArray alloc]initWithArray:viewArray];
[self changeimg];
}
- (void)setTitle:(NSArray *)title
{
_labeltitle = [[NSMutableArray alloc]initWithArray:title];
[self.label setText:_labeltitle[]];
}
@end

代码被封装了,可以直接用我写的这个类生成一个变量,代码中有对各个属性的解释

代码源文件

iOS开发学习--纯代码 UIScrollView 无限循环的实现——代码类封装的更多相关文章

  1. 【好程序员笔记分享】——iOS开发之纯代码键盘退出

    -iOS培训,iOS学习-------型技术博客.期待与您交流!------------ iOS开发之纯代码键盘退出(非常简单)     iOS开发之纯代码键盘退出 前面说到了好几次关于键盘退出的,但 ...

  2. ios开发 学习积累20161027~20161031

    前言 学习ios这几天来,总结下,函数的定义,调用.跟其他语言都有一定的区别: 几个特别重要的就是对象的迭代的使用和判断.取随机数.动画的实现及数组的深入研究等等 之前的总结地址 ios开发 学习积累 ...

  3. 使用CSS3动画属性实现360°无限循环旋转【代码片段】

    使用CSS3的animation动画属性实现360°无限循环旋转. 代码片段: <div id="test"> <img src="/CSS3/img/ ...

  4. IOS开发学习笔记039-autolayout 代码实现

    本文转载至 http://www.cnblogs.com/songliquan/p/4548206.html 1.代码实现比较复杂 代码实现Autolayout的步骤 利用NSLayoutConstr ...

  5. iOS开发学习笔记:基础篇

    iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境 ...

  6. iOS开发学习概述及知识整理

    设计师设计出来了一个不错的引导界面,然而当我看到设计稿的时候,我们的app也没几天就要上线了.这个界面模仿了Evernote iOS app的风格. 我以迅雷不及掩耳盗铃之势开始在Xcode上编程,用 ...

  7. ios开发之OC基础-ios开发学习路线图

    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...

  8. iOS开发学习路线图

    很多初学iOS开发的人会经常问:“我想学iOS应该从何入手呢?”.作为一个做了2年多各种iOS开发的程序员,只想写写自己的一些心得体会,好和体验与不好的体验.写的不好,请多包涵.希望能起到抛砖引玉的作 ...

  9. ios开发学习笔记(1)

    objective-c基础总结 第一二章 1.application:didiFinishLauchingWithOptions:程序启动后立即执行 2.启动界面代码格式:self.window = ...

随机推荐

  1. docker-compose.yml 语法说明

    YAML 模板文件语法 默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建. 其 ...

  2. 新秀学习Hibernate——简单的增加、删、更改、检查操作

    部分博客使用Hibernate单的样例,把数据库的映射显示了出来在上一篇的博客基础上这篇博客讲述怎样利用Hinbernate框架实现简单的数据库操作. 1.增加junit.jar 2.新建一个工具类H ...

  3. Qt XML读取写入操作

    XML(eXtensible Markup Language,可扩展标记语言)是普通用于数据交换和数据存储的一种多用途文本文件格式: SVG(可标量矢量图形)XML格式,QtSvg模块提供了可用于载入 ...

  4. ASP.NET Core和ASP.NET Framework共享Identity身份验证

    .NET Core 已经热了好一阵子,1.1版本发布后其可用性也越来越高,开源.组件化.跨平台.性能优秀.社区活跃等等标签再加上"微软爸爸"主推和大力支持,尽管现阶段对比.net ...

  5. Android(java)学习笔记204:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)

    1.有时候Android系统配置的UI控件,不能满足我们的需求,Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高. ...

  6. sqlserver 2008表分区操作

    表分区操作步骤 1.设计表进行分区的方案,水平分区.垂直分区 a.水平切割将减少表的行数,这样可以将历史数据归档,减少表大小,提高访问速度. b.垂直切割将分为主表和从表方式,将主要的列字段存放在主表 ...

  7. 10.18 noip模拟试题

    分火腿 (hdogs.pas/.c/.cpp) 时间限制:1s:内存限制 64MB 题目描述: 小月言要过四岁生日了,她的妈妈为她准备了n根火腿,她想将这些火腿均分给m位小朋友,所以她可能需要切火腿. ...

  8. 屏蔽Codeforces做题时的Problem tags提示

    当在Codeforces上做题的时,有时会无意撇到右侧的Problem tags边栏,但是原本并不希望能够看到它. 能否把它屏蔽了呢?答案是显然的,我们只需要加一段很短的CSS即可. span.tag ...

  9. alpha属性设置

    alpha是来设置透明度的,它的基本属性是filter:alpha(opacity,finishopacity,style,startX,startY,finishX,finishY).opacity ...

  10. new Integer(1)和Integer.valueOf(1)的区别

    java.lang包中的Integer类是我们比较常用的类,比如以下代码: Integer a=new Integer(1) Integer a=Integer.valueOf(1); 两个都是得到一 ...