给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 / 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的轮播效果相关推荐
- 滚动轮播图+滚动轮播图定时器的添加(还原lol首页的轮播图)
滚动轮播图+滚动轮播图定时器的添加(还原lol首页的轮播图) 每一步都有详细的注释: <!DOCTYPE html> <html lang="en"> &l ...
- android 广告效果图,android 仿首页广告轮播效果
1.我们经常打开一个App会看到有广告图片轮播的效果,首先上效果图1.我们经常打开一个App会看到有广告图片轮播的效果,首先上效果图2.实现的过程1.轮播页面他是一 1.我们经常打开一个App会看到有 ...
- Android使用ViewPager实现左右循环滑动及轮播效果
ViewPager是一个常用的android组件,不过通常我们使用ViewPager的时候不能实现左右无限循环滑动,在滑到边界的时候会看到一个不能翻页的动画,可能影响用户体验.此外,某些区域性的Vie ...
- 用JQ去实现一个轮播效果
前提:用JQ去实现轮播效果一步步的做一个梳理. 首先肯定是轮播的HTML和CSS样式了: <body><div class="pic"><div cl ...
- php制作图片轮播_图片轮播效果实现方法
图片轮播效果如何实现呢本文主要介绍了JQuery实现图片轮播效果的制作原理以及实现代码,文章末尾附上源码下载,具有很好的参考价值.下面跟着小编一起来看下吧,希望能帮助到大家. 用JQuery操作DOM ...
- html5jqueryl轮播图,基于JQuery的实现图片轮播效果(焦点图)
完整的演示代码: JQuery实现图片轮播效果 #banner {position:relative; width:478px; height:286px; border:1px solid #666 ...
- axure 动态面板实现图片轮播效果(淘宝)
淘宝中经常可以看到店铺中的图片轮播效果,本经验将通过axure7.0实现 工具/原料 axure7.0 方法/步骤 下载需要轮播的图片 将图片引入至axure中,将引入的第一张图片转为动态面板 将动态 ...
- java图片特效轮播代码_JQuery实现图片轮播效果
[实例演示] 1 2 3 4 用JQuery操作DOM确实很方便,并且JQuery提供了非常人性化的API应付我们的各种需求,其中选择器在此示例-"JQuery实现图片轮播效果"上 ...
- Javascript实现图片轮播效果。
用js做一个简单的图片轮播效果. 思路如下:用JavaScript来控制轮播的图片的样式(margin-left).用计时器来控制图片的自动播放.鼠标点击控制图片的翻页. 效果图如下.具有以下功能:1 ...
最新文章
- 编译httpd-2.4.46的RPM包
- 创建 linuxrc 文件
- python计算复制比_vbs实现只复制比目标文件更新的文件
- Encoding非常用编码转换
- svm 文本分类 matlab,livsvm文本分类总结详解
- 关闭centos6.7不必要的服务
- python架构师是做什么的_架构师的工作都干些什么?!想做架构师必看!
- 使用MMAction2处理UCF-101数据集
- HTTP的请求连接过程
- macbook系统占用硬盘大_Mac系统文件过大——如何清理Mac系统空间?
- Java线程何时放弃CPU时间片
- 权力的游戏中文字幕词云图
- Vue生命周期和钩子函数详解
- vue中请求拦截器梧桐刷新Token
- RGB565部分常用颜色对照表
- 关于opencv fitLine直线拟合得斜率及截距
- “硬解码”与“软解码”的区别
- 人口会一直增长下去吗_现在世界人口约多少亿 世界人口会一直增加吗还是越来越少...
- 渗透中常用的在线工具和网站总结
- step by step 构建嵌入式Linux系统平台
热门文章
- Python——cmd调用(os.system阻塞处理)(多条命令执行)
- ubuntu 下非交互式执行远程shell命令
- 自己总结的安装zabbix
- 操作主机 RID matser[为企业维护windows server 2008系列七]
- 视频监控智能算法的关键问题分析
- win10镜像重装,快速设置之后无限重启怎么办?
- [LeetCode]Contains Duplicate III
- JAVA 设计模式 享元模式
- 使用javascript oop开发滑动(slide) 菜单控件
- 从今天开始,我就要潜心研究软件开发技术了,不在被名利所困