给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:想起每每打开淘宝,总会被这个玩意先夺眼球,偶尔还去点进去溜溜,幸好我定力好,总能控制住自己的购买欲望,为自己不用剁手感到 ...
随机推荐
- 用企业微信实现预警(shell + python)
目录 一 注册企业微信 注册企业微信必备条件 注册 二 创建消息 创建部门 邀请成员加入 创建应用 关注微工作平台 三 实现预警 通过shell 脚本实现监控预警 通过python 脚本实现监控预警 ...
- windwos文档格式转换成unix格式
在工作学习中我们避免不了需要将一些脚本和命令记录在笔记里面,我使用的是有道云笔记,每当我将上次记录在有道云的脚本复制出来进行使用的时候,总会报一些奇怪的错误,要么是包含换行符,要么就是格式不对,但是我 ...
- mongodb-导出数据到csv文件或json文件
在mongodb的bin目录下, 有一个mongoexport, 可用于数据的导出 [wenbronk@localhost bin]$ ./mongoexport --help Usage: mong ...
- linux文件 面试知识
1. 文件存储结构 Linux正统的文件系统(如ext2.ext3)中,一个文件由目录项.inode和数据块组成. 目录项:包括文件名和inode节点号. inode:又称文件索引节点, ...
- C++中内联函数
目录 什么是内联函数 如何使函数内联 为什么要使用内联函数 inline函数的优缺点分析 什么时候该使用内联函数 正文 在C语言中,我们使用宏定义函数这种借助编译器的优化技术来减少程序的执行时间,那么 ...
- PTA (Advanced Level) 1021 Deepest Root
Deepest Root A graph which is connected and acyclic can be considered a tree. The hight of the tree ...
- Linux下C语言的调试--转
调试是每个程序员都会面临的问题. 如何提高程序员的调试效率, 更好更快地定位程序中的问题从而加快程序开发的进度, 是大家共同面对的问题. 可能Windows用户顺口就会说出:用VC呗 :-) , 它提 ...
- 远程桌面控制项目开发(Spring+Netty+Swing)
[目录] 1.前言 2.初现端倪 3.款款深入 4.责任细分 5.功能层级图 6.项目结构 7.关键类设计 8.一些设计想法 9.待优化 10.一点心得 11.效果演示 12.讨论 13.GitHub ...
- 12.Reflect
Reflect Reflect 概述 Reflect对象与Proxy对象一样,也是 ES6 为了操作对象而提供的新 API.Reflect对象的设计目的有这样几个. (1) 将Object对象的一些明 ...
- jQuery源码分析-03构造jQuery对象-源码结构和核心函数
3. 构造jQuery对象 3.1源码结构 先看看总体结构,再做分解: (function( window, undefined ) { var jQuery = (function() { // 构 ...