给UIScrollView添加category实现UIScrollView的轮播效果
给UIScrollView添加category实现UIScrollView的轮播效果
大家都知道,要给category添加属性是必须通过runtime来实现的,本教程中给UIScrollView添加category添加了好几个属性,也是通过runtime来实现的.
实现后的效果如下:
UIScrollView的category的源码为:
UIScrollView+YX.h + UIScrollView+YX.m
//
// UIScrollView+YX.h
// PageView
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import <UIKit/UIKit.h>
#import "YXGCD.h" @interface UIScrollView (YX) @property (nonatomic, strong) NSNumber *currentPage; // 当前页码
@property (nonatomic, strong) NSNumber *largestPage; // 最大页码
@property (nonatomic, strong) NSNumber *timerInterval; // 时间间隔
@property (nonatomic, strong) GCDTimer *timer; // 定时器 - (void)start; @end
//
// UIScrollView+YX.m
// PageView
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import "UIScrollView+YX.h"
#import <objc/runtime.h> #define ANIMATION_DURATION 0.2 @implementation UIScrollView (YX) static char timerFlag;
- (void)setTimer:(GCDTimer *)timer
{
objc_setAssociatedObject(self, &timerFlag,
nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
objc_setAssociatedObject(self, &timerFlag,
timer,
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (GCDTimer *)timer
{
return objc_getAssociatedObject(self, &timerFlag);
} static char currentPageFlag;
- (void)setCurrentPage:(NSNumber *)currentPage
{
objc_setAssociatedObject(self, ¤tPageFlag,
nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
objc_setAssociatedObject(self, ¤tPageFlag,
currentPage,
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSNumber *)currentPage
{
return objc_getAssociatedObject(self, ¤tPageFlag);
} static char largestPageFlag;
- (void)setLargestPage:(NSNumber *)largestPage
{
objc_setAssociatedObject(self, &largestPageFlag,
nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
objc_setAssociatedObject(self, &largestPageFlag,
largestPage,
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSNumber *)largestPage
{
return objc_getAssociatedObject(self, &largestPageFlag);
} static char timerIntervalFlag;
- (void)setTimerInterval:(NSNumber *)timerInterval
{
objc_setAssociatedObject(self, &timerIntervalFlag,
nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
objc_setAssociatedObject(self, &timerIntervalFlag,
timerInterval,
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSNumber *)timerInterval
{
return objc_getAssociatedObject(self, &timerIntervalFlag);
} - (void)start
{
if (self.currentPage != nil && self.largestPage != nil && \
self.timerInterval != nil && self.timer != nil)
{
__weak UIScrollView *weakObj = self; [self.timer event:^{ if (ceil(weakObj.contentOffset.x / weakObj.bounds.size.width) == \
weakObj.contentOffset.x / weakObj.bounds.size.width)
{
weakObj.currentPage = \
[NSNumber numberWithInt:weakObj.contentOffset.x / .f]; [UIView animateWithDuration:ANIMATION_DURATION animations:^{
CGPoint point = weakObj.contentOffset; weakObj.currentPage = \
[NSNumber numberWithInt:[weakObj.currentPage intValue] + ];
point.x = \
([weakObj.currentPage intValue] % [weakObj.largestPage intValue])\
*weakObj.bounds.size.width; weakObj.contentOffset = point;
}];
} } timeInterval:NSEC_PER_SEC * [self.timerInterval floatValue]]; [[GCDQueue mainQueue] execute:^{
[weakObj.timer start];
} afterDelay:NSEC_PER_SEC * [self.timerInterval floatValue]];
}
else
{
NSLog(@"请配置参数,亲:)");
}
} @end
主函数中使用的源码:
RootViewController.m
//
// RootViewController.m
// PageView
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import "RootViewController.h"
#import "YXGCD.h"
#import "UIScrollView+YX.h" @interface RootViewController ()<UIScrollViewDelegate> @property (nonatomic, strong) GCDTimer *timer; @property (nonatomic, assign) NSInteger currentPage;
@property (nonatomic, assign) NSInteger largestPage; @end @implementation RootViewController - (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor blackColor]; // 数据源
NSArray *array = @[@"YouXianMing", @"QiuLiang", @"LinKen", @"KeLinDun"]; // 初始化UIScrollView
UIScrollView *rootView = [[UIScrollView alloc] initWithFrame:CGRectMake(, , , )];
rootView.pagingEnabled = YES;
rootView.contentSize = CGSizeMake(*array.count, );
[self.view addSubview:rootView]; // 根据数据源加载控件
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
UILabel *tmp = [[UILabel alloc] initWithFrame:CGRectMake(idx*, , , )];
tmp.text = obj;
tmp.layer.borderWidth = .f;
tmp.textColor = [UIColor cyanColor];
tmp.font = [UIFont fontWithName:@"HelveticaNeue-Thin" size:];
tmp.textAlignment = NSTextAlignmentCenter;
tmp.backgroundColor = [UIColor colorWithRed:arc4random()%/.f
green:arc4random()%/.f
blue:arc4random()%/.f
alpha:0.5f];
[rootView addSubview:tmp];
}]; // 设定参数值后开始轮播
rootView.timer = [[GCDTimer alloc] initInQueue:[GCDQueue mainQueue]];
rootView.currentPage = [NSNumber numberWithInt:];
rootView.largestPage = [NSNumber numberWithInt:array.count];
rootView.timerInterval = [NSNumber numberWithInt:];
[rootView start];
} @end
以下来详细讲解下设计的思路:
定时器是用来实现轮播用定时器,这个是最起码的条件:)
runtime添加属性请自行百度脑补或者找笔者之前的教程文章:)
start方法实现的一些细节需要注意:
以下是设计的最为核心的地方:
给UIScrollView添加category实现UIScrollView的轮播效果的更多相关文章
- ios图片轮播效果
代码地址如下:http://www.demodashi.com/demo/11959.html ImageCarousel 简单封装的图片轮播器 内存过大由于我加载的图片分辨率较高(4k) 文件目录 ...
- jQuery个性化图片轮播效果
jQuery个性化图片轮播效果 购物产品展示:图片轮播器<效果如下所示> 思路说明: 每隔一段时间,实现图片的自动切换及选项卡选中效果,鼠标划入图片动画停止,划出或离开动画开始 两个区域: ...
- Android使用ViewPager实现左右循环滑动及轮播效果
边界的时候会看到一个不能翻页的动画,可能影响用户体验.此外,某些区域性的ViewPager(例如展示广告或者公告之类的ViewPager),可能需要自动轮播的效果,即用户在不用滑动的情况下就能够看到其 ...
- 调用MyFocus库,简单实现二十几种轮播效果
一.首先点击这里下载myFocus库文件,标准文件库就行了,很小仅仅1.4M. myFocus库有以下的好处: a . 文件小巧却高效强大,能够实现二十几种轮播的效果. b . 极其简单的使用,只需要 ...
- CSS3图片轮播效果
原文:CSS3图片轮播效果 在网页中用到图片轮播效果,单纯的隐藏.显示,那再简单不过了,要有动画效果,如果是自己写的话(不用jquery等),可能要费点时间.css3的出现,让动画变得不再是问题,而且 ...
- 超实用的JavaScript代码段 Item3 --图片轮播效果
图片轮播效果 图片尺寸 统一设置成:490*170px; 一.页面加载.获取整个容器.所有放数字索引的li及放图片列表的ul.定义放定时器的变量.存放当前索引的变量index 二.添加定时器,每隔2秒 ...
- vue项目全局引入vue-awesome-swiper插件做出轮播效果
在安装了vue的前提下,打开命令行窗口,输入vue init webpack swiper-test,创建一个vue项目且名为swiper-test(创建速度可能会有点慢,耐心等),博文讲完后,源码托 ...
- js的轮播效果
图片的轮播效果!主要运用了元素的style样式属性,与 setInterval(); <!DOCTYPE html> <html> <head lang="en ...
- JS实现焦点图轮播效果
大家平时逛淘宝网的时候,在首页就能看到焦点图轮播的效果,就是这个样子的: PS:想起每每打开淘宝,总会被这个玩意先夺眼球,偶尔还去点进去溜溜,幸好我定力好,总能控制住自己的购买欲望,为自己不用剁手感到 ...
随机推荐
- facebook 摘要生成阅读笔记(一) A Neural Attention Model for Sentence Summarization
流程: 1.文本和摘要全部输入到模型中. 2.训练时,对生成摘要取前C个词,从头开始取,如果生成的摘要不足C,那么不足的地方直接补<s>. 3.训练时,最大化生成的摘要与原摘要的概率,即每 ...
- spring整合elasticsearch之环境搭建
推荐一个非常好的博客: 点我 // 测试使用docker下启动的es不管用, 在linux下或者windows下运行的es可用 // 进一步测试docker下启动的es链接时, 开启嗅探也链接不上, ...
- Entity Framework取消修改
最近碰到一个场景:在Entity Framework保存错误的时候,需要将该错误记录在DB中.因为DB在savechange的时候会继续保存之前的数据,所以一直会报错,无法保存错误日志. 这就需要实现 ...
- windows server服务器上部署java+tomcat网站域名配置
如果只是部署java项目的话,可以把IIS删除,然后在服务器上安装jdk tomcat 配置好环境变量,就和你在自己计算机上开发一样,把你的项目war包拷到tomcat下的webapps里(任意目录都 ...
- log4配置
log4j 和 log4j2 方式一:log4j2.xml 添加 jar 包 <!-- log4j-core --> <!-- <dependency> <grou ...
- 常用工具说明--jsdoc 前端文档输出工具
1.利用npm安装jsdoc模块 npm install jsdoc -g 2.由于jsdoc默认的生成文档模板不好看,可以下载一套好看些的模板,如 jaguar.js 下载地址:https:// ...
- WPF进度条
ProgressBar控件与传统WinForm使用方法完全一样,我们只需关注: Minimum——最小值,默认为0: Maximum——最大值,默认为100. Value——当前值. 关键是它的控 ...
- 双11抢券,写一个自动打开页面的html,仅仅是设定时间打开抢券的页面
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- 使用C#利用cmd来调用java jar包获取其中的数据
其实也很简单,就是在C#中构建一个Process,启动jar包,并且给jar包传递参数 因为我并没有怎么学过JAVA,所以只写了个很小的Demo,就是根据传入的参数获取对应的数据 以下是JAVA De ...
- php5.5过渡--mysql连接
以前: // $conn=mysql_connect("localhost","root","");// $db=mysql_select_ ...