IOS开发UI篇之自动滚动图片
我们在做项目是有时候会遇到设置自动滚动图片,所以我自己也遇到过两次。觉得他是一个挺有意思东西,所以做了下总结
DEMO:
.h
#import <UIKit/UIKit.h> @interface ImagePlayView : UIView<UIScrollViewDelegate> @property (nonatomic, strong) UIScrollView * scroll;
@property (nonatomic, strong) UIPageControl * play;
@property (nonatomic, strong) NSTimer * timer; @end
.m
#import "ImagePlayView.h" @implementation ImagePlayView - (id) initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame])
{
//创建一个UIscrollView组件,作为滚动组件的头视图
CGRect headScroll = CGRectMake(, , self.frame.size.width, self.frame.size.height);
_scroll = [[UIScrollView alloc] initWithFrame:headScroll];
//取消水平滚动条
_scroll.showsHorizontalScrollIndicator = NO;
//取消弹性设置
_scroll.bounces = NO;
//设置分页
_scroll.pagingEnabled = YES;
[self addSubview: _scroll];
for (int i = ; i < ; i ++)
{
UIImageView * imageV = [[UIImageView alloc] initWithFrame:CGRectMake(i * self.frame.size.width, , self.frame.size.width, self.frame.size.height)];
imageV.image = [UIImage imageNamed:[NSString stringWithFormat:@"banner-%d",i + ]];
[_scroll addSubview: imageV];
}
_scroll.contentSize = CGSizeMake( * self.frame.size.width, );
_scroll.delegate = self; //设置分页指示器
_play = [[UIPageControl alloc] initWithFrame:CGRectMake(, , self.frame.size.width/, )];
//设置分页器的位置
_play.center = CGPointMake(self.frame.size.width/, self.frame.size.height/1.2);
// 设置其它页指示器圆点的颜色
_play.pageIndicatorTintColor = [UIColor grayColor];
// 设置当前页指示器圆点的颜色
_play.currentPageIndicatorTintColor = [UIColor grayColor];
// 设置分页器的页数
_play.numberOfPages = ;
// 设置当前是第几页
_play.currentPageIndicatorTintColor = ;
[self addSubview:_play]; //设置计时器
_timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(time) userInfo:nil repeats:YES];
// 先获取当前的消息循环,利用消息循环设置计时器对象的优先级和控件的优先级相同
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:self.timer forMode:NSRunLoopCommonModes]; }
return self;
} -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
// 解决第一个Bug:按住滚动内容拖拽或不松手,一旦松手就会滚动好多次。解决方法当开始拖动时令计时器失效。当拖动结束后再新建一个计时器
[self.timer invalidate];
// 计时器一旦失效,就不能再使用了。所以赋给它一个空指针
self.timer = nil;
} // 在拖动的过程中会执行这个方法
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
// 先获根据内容的偏移位置,获取当前的页数
int page =( scrollView.contentOffset.x+scrollView.frame.size.width*0.5)/ scrollView.frame.size.width; // 在拖动的过程中把当前的页码告知分页控制器组件
self.play.currentPage = page;
} // 在拖动结束后会执行这个方法
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
// 当拖动结束后再新建一个计时器, 第一个Bug解除了
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(time) userInfo:nil repeats:YES]; // 解决第二个BUg:当拖动点击别的控件时。将停止滚动,这是由于单线程执行,而计时器对象和网络对象的优先级小于控件的优先级,所以当拖动控件时,就不会再执行NSTimer计时器对象的操作。解决方法如下:每当新建一个NSTimer计时器,就先获取当前的消息循环,并在消息循环中设置它的优先级和控件的优先级相同,这时程序会分时间片给优先级相同的对象;
NSRunLoop *runRoop = [NSRunLoop currentRunLoop]; // 获取当前的消息循环 // 利用消息循环为timer对象设置优先级和控件的优先级相同
[runRoop addTimer:self.timer forMode:NSRunLoopCommonModes]; } - (void) time
{ // 获取当前的页数
NSInteger page = self.play.currentPage;
if (page == self.play.numberOfPages-) {
page = ;
}else{
page++;
} // 根据当前的页数计算内容偏移量contentOffset的大小
// 通过代码设置contentOffset偏移,实现自动滚动
// 非动画方式
//self.scrollView.contentOffset = CGPointMake(page*self.scrollView.frame.size.width, 0); // 通过动画方式
[self.scroll setContentOffset:CGPointMake(page*self.scroll.frame.size.width, ) animated:YES]; } @end
IOS开发UI篇之自动滚动图片的更多相关文章
- iOS开发UI篇—Quartz2D使用(图片剪切)
iOS开发UI篇—Quartz2D使用(图片剪切) 一.使用Quartz2D完成图片剪切 1.把图片显示在自定义的view中 先把图片绘制到view上.按照原始大小,把图片绘制到一个点上. 代码: - ...
- iOS开发UI篇—UIScrollView控件实现图片缩放功能
iOS开发UI篇—UIScrollView控件实现图片缩放功能 一.缩放 1.简单说明: 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScrollView不仅能滚动显示大量内容,还能对 ...
- iOS开发UI篇—UIScrollView控件实现图片轮播
iOS开发UI篇—UIScrollView控件实现图片轮播 一.实现效果 实现图片的自动轮播 二.实现代码 storyboard中布局 代码: #import "YYV ...
- 【转】 iOS开发UI篇—UIScrollView控件实现图片轮播
原文:http://www.cnblogs.com/wendingding/p/3763527.html iOS开发UI篇—UIScrollView控件实现图片轮播 一.实现效果 实现图片的自动轮播 ...
- iOS开发UI篇—UITableviewcell的性能优化和缓存机制
iOS开发UI篇—UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource ...
- iOS开发UI篇—无限轮播(循环利用)
iOS开发UI篇—无限轮播(循环利用) 一.无限轮播 1.简单说明 在开发中常需要对广告或者是一些图片进行自动的轮播,也就是所谓的无限滚动. 在开发的时候,我们通常的做法是使用一个UIScrollV ...
- iOS开发UI篇—UITableviewcell的性能问题
iOS开发UI篇—UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource ...
- iOS开发UI篇—CALayer简介
iOS开发UI篇—CALayer简介 一.简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. 其实 ...
- iOS开发UI篇—核心动画(UIView封装动画)
iOS开发UI篇—核心动画(UIView封装动画) 一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画 ...
随机推荐
- Linux应用总结:自动删除n天前日志
linux是一个很能自动产生文件的系统,日志.邮件.备份等.虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种爽快的事情.不用你去每天惦记着是否需要清理日志 ...
- Codeforces 707 E. Garlands (二维树状数组)
题目链接:http://codeforces.com/problemset/problem/707/E 给你nxm的网格,有k条链,每条链上有len个节点,每个节点有一个值. 有q个操作,操作ask问 ...
- js 浮点小数计算精度问题 parseFloat 精度问题
在js中进行以元为单位进行金额计算时 使用parseFloat会产生精度问题 var price = 10.99; var quantity = 7; var needPay = parseFloat ...
- OC:面向对象的编程思想、基本的知识点总结、强,弱引用
OC 面向对象 和 面向过程 参考 面向过程:使用步骤划分功能,然后用函数一步一步的调用 面向对象:OOP (Object Oriented Programming) 使用功能来简化问题, 面向对象语 ...
- (剑指Offer)面试题31:连续子数组的最大和
题目: 输入一个整型数组,数组里有正数也有负数,数组中一个或连续多个整数组成一个子数组,求所有子数组的和的最大值.要求时间复杂度为O(n) 思路: 1.数组累加 从头到尾逐个累加数组中的每个数字,当累 ...
- CloudStack 4.2 与CloudStack 4.1二级存储API发生变化
CloudStack 4.1查看二级存储 http://192.168.150.16:8080/client/api?command=listHosts&response=json&s ...
- Objc中2维指针作为输出参数时由ARC及@autoreleasepool引发的血案
先看下面一个例子 #import <UIKit/UIKit.h> #import "AppDelegate.h" @interface Something : NSOb ...
- PL/pgSQL的anyelement例子
http://www.postgresonline.com/journal/archives/239-The-wonders-of-Any-Element.html 定义函数 pgsql=# CREA ...
- insertAfter()
<div id="b">bbbbbbbbb</div> <div>dddddd</div> JavaScript window.on ...
- 如何用C#语言构造蜘蛛程序
"蜘蛛"(Spider)是Internet上一种很有用的程序,搜索引擎利用蜘蛛程序将Web页面收集到数据库,企业利用蜘蛛程序监视竞争对手的网站并跟踪变动,个人用户用蜘蛛程序下载We ...