一个简单的利用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. [RxJS] Utility operator: do

    We just saw map which is a transformation operator. There are a couple of categories of operators, s ...

  2. ZOJ 3903 Ant(公式推导)

    这个公式推导过程是看的这位大牛的http://blog.csdn.net/bigbigship/article/details/49123643 扩展欧几里德求模的逆元方法: #include < ...

  3. inverse 相关设置

    <set name="students" table = "student" inverse="true"> <!-- 指 ...

  4. SQL语句优化(分享)

    一.操作符优化 1.IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格.但是用IN的SQL性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用 ...

  5. Active Desktop--桌面字体背景被修改

    怎么修改回来 步骤如下 方法一.在桌面上点击右键 -- 排列图标 -- 去掉“在桌面上锁定Web项目”上的勾. 方法二.右键点击我的电脑 -- 属性 -- 高级 -- 点击“性能”下面的“设置”按钮, ...

  6. 怎么让自己的java系统使用支付接口

    昨天花了好久的时间学习了支付接口的教,我看了前7集,就够用了,大家上网搜索一下传智播客在线支付还不错. 1.一开始有一个form表单 2.这个表单是他帮你写好的,有很多银行,银行的name都是特定的 ...

  7. Android开发----权限大全

    一.添加权限格式:     示例:      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STOR ...

  8. oracle中用comment on的用法

    oracle中用comment on命令给表或字段加以说明,语法如下:COMMENT ON  { TABLE [ schema. ]    { table | view }  | COLUMN [ s ...

  9. $(document).ready(function(){});不执行

    这里可能会有以下几种原因,请你挨个排查: 1.jqury的文件一定要引入1.js文件的引用路径不正确,特别是使用了命名空间,容易造成路径错误,使用绝对路径看是否成功 2.某一些函数使用错误,举个例子, ...

  10. C#堆栈原理(我有两个例子测试你到底会不会)

    背景 上次写了一篇文章关于try finnally的一些疑问(被我用windows live覆盖了,草),后来经过大神们解释,我明白了在我理解了try.finnally运行原理后,还欠缺的就是关于值类 ...