给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 / 320.f];[UIView animateWithDuration:ANIMATION_DURATION animations:^{CGPoint point         = weakObj.contentOffset;weakObj.currentPage   = \[NSNumber numberWithInt:[weakObj.currentPage intValue] + 1];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"];// 初始化UIScrollViewUIScrollView *rootView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];rootView.pagingEnabled = YES;rootView.contentSize   = CGSizeMake(320*array.count, 320);[self.view addSubview:rootView];// 根据数据源加载控件[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {UILabel *tmp          = [[UILabel alloc] initWithFrame:CGRectMake(idx*320, 0, 320, 320)];tmp.text              = obj;tmp.layer.borderWidth = 2.f;tmp.textColor         = [UIColor cyanColor];tmp.font              = [UIFont fontWithName:@"HelveticaNeue-Thin" size:30];tmp.textAlignment     = NSTextAlignmentCenter;tmp.backgroundColor   = [UIColor colorWithRed:arc4random()%100/100.fgreen:arc4random()%100/100.fblue:arc4random()%100/100.falpha:0.5f];[rootView addSubview:tmp];}];// 设定参数值后开始轮播rootView.timer         = [[GCDTimer alloc] initInQueue:[GCDQueue mainQueue]];rootView.currentPage   = [NSNumber numberWithInt:0];rootView.largestPage   = [NSNumber numberWithInt:array.count];rootView.timerInterval = [NSNumber numberWithInt:4];[rootView start];
}@end

以下来详细讲解下设计的思路:

定时器是用来实现轮播用定时器,这个是最起码的条件:)

runtime添加属性请自行百度脑补或者找笔者之前的教程文章:)

start方法实现的一些细节需要注意:

以下是设计的最为核心的地方:

给UIScrollView添加category实现UIScrollView的轮播效果相关推荐

  1. 滚动轮播图+滚动轮播图定时器的添加(还原lol首页的轮播图)

    滚动轮播图+滚动轮播图定时器的添加(还原lol首页的轮播图) 每一步都有详细的注释: <!DOCTYPE html> <html lang="en"> &l ...

  2. android 广告效果图,android 仿首页广告轮播效果

    1.我们经常打开一个App会看到有广告图片轮播的效果,首先上效果图1.我们经常打开一个App会看到有广告图片轮播的效果,首先上效果图2.实现的过程1.轮播页面他是一 1.我们经常打开一个App会看到有 ...

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

    ViewPager是一个常用的android组件,不过通常我们使用ViewPager的时候不能实现左右无限循环滑动,在滑到边界的时候会看到一个不能翻页的动画,可能影响用户体验.此外,某些区域性的Vie ...

  4. 用JQ去实现一个轮播效果

    前提:用JQ去实现轮播效果一步步的做一个梳理. 首先肯定是轮播的HTML和CSS样式了: <body><div class="pic"><div cl ...

  5. php制作图片轮播_图片轮播效果实现方法

    图片轮播效果如何实现呢本文主要介绍了JQuery实现图片轮播效果的制作原理以及实现代码,文章末尾附上源码下载,具有很好的参考价值.下面跟着小编一起来看下吧,希望能帮助到大家. 用JQuery操作DOM ...

  6. html5jqueryl轮播图,基于JQuery的实现图片轮播效果(焦点图)

    完整的演示代码: JQuery实现图片轮播效果 #banner {position:relative; width:478px; height:286px; border:1px solid #666 ...

  7. axure 动态面板实现图片轮播效果(淘宝)

    淘宝中经常可以看到店铺中的图片轮播效果,本经验将通过axure7.0实现 工具/原料 axure7.0 方法/步骤 下载需要轮播的图片 将图片引入至axure中,将引入的第一张图片转为动态面板 将动态 ...

  8. java图片特效轮播代码_JQuery实现图片轮播效果

    [实例演示] 1 2 3 4 用JQuery操作DOM确实很方便,并且JQuery提供了非常人性化的API应付我们的各种需求,其中选择器在此示例-"JQuery实现图片轮播效果"上 ...

  9. Javascript实现图片轮播效果。

    用js做一个简单的图片轮播效果. 思路如下:用JavaScript来控制轮播的图片的样式(margin-left).用计时器来控制图片的自动播放.鼠标点击控制图片的翻页. 效果图如下.具有以下功能:1 ...

最新文章

  1. 编译httpd-2.4.46的RPM包
  2. 创建 linuxrc 文件
  3. python计算复制比_vbs实现只复制比目标文件更新的文件
  4. Encoding非常用编码转换
  5. svm 文本分类 matlab,livsvm文本分类总结详解
  6. 关闭centos6.7不必要的服务
  7. python架构师是做什么的_架构师的工作都干些什么?!想做架构师必看!
  8. 使用MMAction2处理UCF-101数据集
  9. HTTP的请求连接过程
  10. macbook系统占用硬盘大_Mac系统文件过大——如何清理Mac系统空间?
  11. Java线程何时放弃CPU时间片
  12. 权力的游戏中文字幕词云图
  13. Vue生命周期和钩子函数详解
  14. vue中请求拦截器梧桐刷新Token
  15. RGB565部分常用颜色对照表
  16. 关于opencv fitLine直线拟合得斜率及截距
  17. “硬解码”与“软解码”的区别
  18. 人口会一直增长下去吗_现在世界人口约多少亿 世界人口会一直增加吗还是越来越少...
  19. 渗透中常用的在线工具和网站总结
  20. step by step 构建嵌入式Linux系统平台

热门文章

  1. Python——cmd调用(os.system阻塞处理)(多条命令执行)
  2. ubuntu 下非交互式执行远程shell命令
  3. 自己总结的安装zabbix
  4. 操作主机 RID matser[为企业维护windows server 2008系列七]
  5. 视频监控智能算法的关键问题分析
  6. win10镜像重装,快速设置之后无限重启怎么办?
  7. [LeetCode]Contains Duplicate III
  8. JAVA 设计模式 享元模式
  9. 使用javascript oop开发滑动(slide) 菜单控件
  10. 从今天开始,我就要潜心研究软件开发技术了,不在被名利所困