一个简单的利用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. xcode升级或者重新安装后不能编译的解决方法

    昨天由于xcode有一些问题,因此进行了重新安装,结果安装好后进行编译,没有进行任何改动的代码出现了两个fatal error 查看错误信息为什么的header has allready build, ...

  2. eclipse删除空行

    1.打开源码编辑器 2.使用快捷键Ctrl+f 3.在Find输入框中输入:^\s*\n 4.Replace With输入框的值为空 5.在[Options]选中的"Regular expr ...

  3. Javascript绝句欣赏

    1. 取整同时转成数值型: '10.567890'|0 结果: 10 '10.567890'^0 结果: 10 -2.23456789|0 结果: -2 ~~-2.23456789 结果: -2 2. ...

  4. Hex编码 十六进制编码

    import java.io.UnsupportedEncodingException; import java.net.URLEncoder; /**  * HEX字符串与字节码(字符串)转换工具 ...

  5. 自己写的自动生成动态边框的jquery小插件

    思路就是在元素四周添加<ul>列表,然后周期性地改变它的颜色,实现动态的效果,不支持ie7.ie8 预览链接http://gorey.sinaapp.com/myBorder/border ...

  6. 使用了hibernate时候乱码问题

    在配置文件的url地址最后加上characterEncoding=utf-8

  7. reactjs 入门

    地址搜集:http://www.cocoachina.com/webapp/20150604/12035.html class 属性需要写成 className ,for 属性需要写成 htmlFor ...

  8. Kettle 实现mysql数据库不同表之间数据同步——实验过程

    下面是试验的主要步骤: 在上一篇文章中LZ已经介绍了,实验的环境和实验目的. 在本篇文章中主要介绍侧重于对Kettle ETL的相应使用方法, 在这里LZ需要说明一下,LZ成为了避免涉及索引和表连接等 ...

  9. 分享最近和同事处理的 解析XML的相关问题

    CREATE OR REPLACE PROCEDURE BATCHINSERTSK_DEVICE_RECORD1(      xmlstr  IN clob,          v_commits o ...

  10. error C2220: warning treated as error - no 'object' file generated解决方法

    error C2220: warning treated as error - no 'object' file generated 警讯视为错误 - 生成的对象文件 / WX告诉编译器将所有警告视为 ...