iOS开发学习--纯代码 UIScrollView 无限循环的实现——代码类封装
一个简单的利用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 无限循环的实现——代码类封装的更多相关文章
- 【好程序员笔记分享】——iOS开发之纯代码键盘退出
-iOS培训,iOS学习-------型技术博客.期待与您交流!------------ iOS开发之纯代码键盘退出(非常简单) iOS开发之纯代码键盘退出 前面说到了好几次关于键盘退出的,但 ...
- ios开发 学习积累20161027~20161031
前言 学习ios这几天来,总结下,函数的定义,调用.跟其他语言都有一定的区别: 几个特别重要的就是对象的迭代的使用和判断.取随机数.动画的实现及数组的深入研究等等 之前的总结地址 ios开发 学习积累 ...
- 使用CSS3动画属性实现360°无限循环旋转【代码片段】
使用CSS3的animation动画属性实现360°无限循环旋转. 代码片段: <div id="test"> <img src="/CSS3/img/ ...
- IOS开发学习笔记039-autolayout 代码实现
本文转载至 http://www.cnblogs.com/songliquan/p/4548206.html 1.代码实现比较复杂 代码实现Autolayout的步骤 利用NSLayoutConstr ...
- iOS开发学习笔记:基础篇
iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境 ...
- iOS开发学习概述及知识整理
设计师设计出来了一个不错的引导界面,然而当我看到设计稿的时候,我们的app也没几天就要上线了.这个界面模仿了Evernote iOS app的风格. 我以迅雷不及掩耳盗铃之势开始在Xcode上编程,用 ...
- ios开发之OC基础-ios开发学习路线图
本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...
- iOS开发学习路线图
很多初学iOS开发的人会经常问:“我想学iOS应该从何入手呢?”.作为一个做了2年多各种iOS开发的程序员,只想写写自己的一些心得体会,好和体验与不好的体验.写的不好,请多包涵.希望能起到抛砖引玉的作 ...
- ios开发学习笔记(1)
objective-c基础总结 第一二章 1.application:didiFinishLauchingWithOptions:程序启动后立即执行 2.启动界面代码格式:self.window = ...
随机推荐
- 每天一个JavaScript实例-从一个div元素删除一个段落
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- mysql查看端口
在你的my.ini(Windows)或my.cfg(Linux) 中就有啊. 或者如果已经连入MySQL可以直接 SQL code ? 1 2 3 4 5 6 7 8 9 mysql> show ...
- svn 设置钩子将代码同步到web目录下面
首先:确定思路: 要在SVN服务中,找到仓库文件夹的位置,在相应的项目中找到hooks文件夹.在该文件中添加一个post-commit文件: 当有commit动作发生时(提交到SVN服务是就会执行这个 ...
- rabbitMQ实战(一)---------使用pika库实现hello world
rabbitMQ实战(一)---------使用pika库实现hello world 2016-05-18 23:29 本站整理 浏览(267) pika是RabbitMQ团队编写的官方Pyt ...
- codevs 1817 灾后重建
/* 暴力暴力 离线每次添边 堆优化dij 70 SPFA 80..... */ #include<iostream> #include<cstdio> #include< ...
- Android 使用弹出对话框,报Unable to add window错误
今天在使用Android弹出对话框的时候,报了一个unable to add window错误,我的代码如下 new AlertDialog.Builder(getApplicationContext ...
- java中XMLGregorianCalendar类型和Date类型之间的相互转换
import java.text.SimpleDateFormat;import java.util.Date;import java.util.GregorianCalendar;import ja ...
- ^(bitwise exclusive Or).
一个数,进行异或同一个数两次,将得到原来的数,例如: 6 ^ 4 ^ 4 = 6; 0000-0000-0000-0110 ^ 0000-0000-0000-0100 ---------------- ...
- 利用抽象、多态实现无反射的绿色环保ORM框架
最近一直在忙新公司的基础库建设,对系统架构.开发框架及快速开发平台的设计实施都积累了一定的实践经验. 一般的中小型的软件开发公司,如果按照技术储备来衡量软件项目的技术含量的评定依据是可行的.但如果光是 ...
- 苹果App store 2015最新审核标准公布(2015.3)
苹果近日更新了AppStore审核指南的相关章节,对此前版本进行了修改和完善.除了增加应用截图.预览等限制外,使用ApplePay进行定期付款的应用程序必须展示每个阶段所需款额,费用归属以及如何取消. ...