给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, &currentPageFlag,
nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
objc_setAssociatedObject(self, &currentPageFlag,
currentPage,
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSNumber *)currentPage
{
return objc_getAssociatedObject(self, &currentPageFlag);
} 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的轮播效果的更多相关文章

  1. ios图片轮播效果

    代码地址如下:http://www.demodashi.com/demo/11959.html ImageCarousel 简单封装的图片轮播器 内存过大由于我加载的图片分辨率较高(4k) 文件目录 ...

  2. jQuery个性化图片轮播效果

    jQuery个性化图片轮播效果 购物产品展示:图片轮播器<效果如下所示> 思路说明: 每隔一段时间,实现图片的自动切换及选项卡选中效果,鼠标划入图片动画停止,划出或离开动画开始 两个区域: ...

  3. Android使用ViewPager实现左右循环滑动及轮播效果

    边界的时候会看到一个不能翻页的动画,可能影响用户体验.此外,某些区域性的ViewPager(例如展示广告或者公告之类的ViewPager),可能需要自动轮播的效果,即用户在不用滑动的情况下就能够看到其 ...

  4. 调用MyFocus库,简单实现二十几种轮播效果

    一.首先点击这里下载myFocus库文件,标准文件库就行了,很小仅仅1.4M. myFocus库有以下的好处: a . 文件小巧却高效强大,能够实现二十几种轮播的效果. b . 极其简单的使用,只需要 ...

  5. CSS3图片轮播效果

    原文:CSS3图片轮播效果 在网页中用到图片轮播效果,单纯的隐藏.显示,那再简单不过了,要有动画效果,如果是自己写的话(不用jquery等),可能要费点时间.css3的出现,让动画变得不再是问题,而且 ...

  6. 超实用的JavaScript代码段 Item3 --图片轮播效果

    图片轮播效果 图片尺寸 统一设置成:490*170px; 一.页面加载.获取整个容器.所有放数字索引的li及放图片列表的ul.定义放定时器的变量.存放当前索引的变量index 二.添加定时器,每隔2秒 ...

  7. vue项目全局引入vue-awesome-swiper插件做出轮播效果

    在安装了vue的前提下,打开命令行窗口,输入vue init webpack swiper-test,创建一个vue项目且名为swiper-test(创建速度可能会有点慢,耐心等),博文讲完后,源码托 ...

  8. js的轮播效果

    图片的轮播效果!主要运用了元素的style样式属性,与 setInterval(); <!DOCTYPE html> <html> <head lang="en ...

  9. JS实现焦点图轮播效果

    大家平时逛淘宝网的时候,在首页就能看到焦点图轮播的效果,就是这个样子的: PS:想起每每打开淘宝,总会被这个玩意先夺眼球,偶尔还去点进去溜溜,幸好我定力好,总能控制住自己的购买欲望,为自己不用剁手感到 ...

随机推荐

  1. Linux-(tar,gzip,df,du)

    tar命令 首先要弄清两个概念:打包和压缩.打包是指将一大堆文件或目录变成一个总的文件:压缩则是将一个大的文件通过一些压缩算法变成一个小文件. 为什么要区分这两个概念呢?这源于Linux中很多压缩程序 ...

  2. HTTPClient 超时链接设置

    远程访问链接,设置时间,从而减少不必要的麻烦,但是HttpClient版本不一致,方法不一样,所以有了如下设置 原帖链接:https://www.cnblogs.com/jimmy-muyuan/p/ ...

  3. HtmlUnit: A Simple Example: Check Yahoo Email---转载

    1. src http://www.muneebahmad.com/index.php/archives/81 package com.examples.htmlunit; import java.i ...

  4. 2<<3=?

    public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(" ...

  5. 百度Ueditor编辑器

    百度的Ueditor编辑器出于安全性考虑,用户在html模式下粘贴进去的html文档会自动被去除样式和转义.虽然安全的,但是非常不方便. 1. ueditor.config.js 做出如下修改即可: ...

  6. AutoFac使用方法总结二:事件与依赖循环

         事件 AutoFac支持三种事件:OnActivating,OnActivated,OnRelease.OnActivating在注册组件使用之前会被调用,此时可以替换实现类或者进行一些其他 ...

  7. Centos7宽带连接

    网上大多教程都是虚拟机上实现宽带连接的,但是实际有差别 装完系统最头疼的就是宽带连接 转自:centos创建宽带连接-EnchanterBlue-ChinaUnix博客 http://blog.chi ...

  8. vue-router 路由懒加载

    webpack打包会将所有资源文件合并压缩成一个文件,导致最终的文件非常大,甚至超过几M,以致页面首次加载会比较慢,如下图: 其中红色标出的是在浏览器中加载的js文件,gzip压缩前已经达到500多K ...

  9. Python手写模拟单向链表对象,栈对象和树

    单向链表: class error(Exception): def __init__(self,msg): super(error,self).__init__() self.msg=msg def ...

  10. cordova打包安卓或IOS应用

    1,先搞个java jdk.我先用的1.7版本的,用cordova打包的时候各种报错,应该是向下不兼容吧.又换了个1.8版本.装jdk一定要注意jdk跟jre不能都装在目标文件夹的根目录下,jdk跟j ...