iOS之UIScrollView循环滚动
#import "ViewController.h"
#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
#define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height
#define IMAGEVIEW_COUNT 3
@interface ViewController () <UIScrollViewDelegate> {
UIScrollView *_scrollView;
UIImageView *_leftImageView;
UIImageView *_centerImageView;
UIImageView *_rightImageView;
UIPageControl *_pageControl;
UILabel *_label;
NSMutableDictionary *_imageData;//图片数据
int _currentImageIndex;//当前图片索引
int _imageCount;//图片总数
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//加载数据
[self loadImageData];
//添加滚动控件
[self addScrollView];
//添加图片控件
[self addImageViews];
//添加分页控件
[self addPageControl];
//添加图片信息描述控件
[self addLabel];
//加载默认图片
[self setDefaultImage];
}
#pragma mark 加载图片数据
-(void)loadImageData {
//读取程序包路径中的资源文件
NSString *path = [[NSBundle mainBundle] pathForResource:@"imageInfo" ofType:@"plist"];
_imageData = [NSMutableDictionary dictionaryWithContentsOfFile:path];
_imageCount = (int)_imageData.count;
}
#pragma mark 添加控件
-(void)addScrollView {
// _scrollView = [[UIScrollView alloc] initWithFrame:[UIScreen mainScreen].bounds];
_scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 20+20, SCREEN_WIDTH, 200)];
_scrollView.backgroundColor = [UIColor lightGrayColor];
//设置代理
_scrollView.delegate = self;
//设置滚动范围
_scrollView.contentSize = CGSizeMake(IMAGEVIEW_COUNT*SCREEN_WIDTH, 0);
//设置当前显示的位置为中间图片(设置scrollView偏移量)
[_scrollView setContentOffset:CGPointMake(SCREEN_WIDTH, 0)];
//设置分页
_scrollView.pagingEnabled = YES;
//隐藏水平条 竖向条
_scrollView.showsHorizontalScrollIndicator = NO;
_scrollView.showsVerticalScrollIndicator = NO;
//关闭弹簧效果
// _scrollView.bounces = NO;
[self.view addSubview:_scrollView];
}
#pragma mark 添加图片三个控件
-(void)addImageViews {
_leftImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, _scrollView.frame.size.height)];
//会保证图片比例不变,而且全部显示在ImageView中,这意味着ImageView会有部分空白
_leftImageView.contentMode=UIViewContentModeScaleAspectFit;
[_scrollView addSubview:_leftImageView];
_centerImageView = [[UIImageView alloc] initWithFrame:CGRectMake(SCREEN_WIDTH, 0, SCREEN_WIDTH, _scrollView.frame.size.height)];
_centerImageView.contentMode = UIViewContentModeScaleAspectFit;
[_scrollView addSubview:_centerImageView];
_rightImageView = [[UIImageView alloc] initWithFrame:CGRectMake(2*SCREEN_WIDTH, 0, SCREEN_WIDTH, _scrollView.frame.size.height)];
_rightImageView.contentMode = UIViewContentModeScaleAspectFit;
[_scrollView addSubview:_rightImageView];
}
#pragma mark 设置默认显示图片
-(void)setDefaultImage {
//加载默认图片
_leftImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%i.jpeg",_imageCount-1]];
_centerImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%i.jpeg",0]];
_rightImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%i.jpeg",1]];
_currentImageIndex = 0;
//设置当前页
_pageControl.currentPage = _currentImageIndex;
NSString *imageName = [NSString stringWithFormat:@"%i.jpeg",_currentImageIndex];
_label.text = _imageData[imageName];
}
#pragma mark 添加分页控件
-(void)addPageControl {
_pageControl = [[UIPageControl alloc] init];
// _pageControl.backgroundColor = [UIColor orangeColor];
//注意此方法可以根据页数返回UIPageControl合适的大小
CGSize size = [_pageControl sizeForNumberOfPages:_imageCount];
_pageControl.bounds = CGRectMake(0, 0, size.width, size.height);
_pageControl.center = CGPointMake(SCREEN_WIDTH*2/3, _scrollView.frame.origin.y+_scrollView.frame.size.height-10);
//设置颜色
_pageControl.pageIndicatorTintColor = [UIColor colorWithRed:193/255.0 green:219/255.0 blue:249/255.0 alpha:1];
//设置当前页颜色
_pageControl.currentPageIndicatorTintColor = [UIColor colorWithRed:0 green:150/255.0 blue:1 alpha:1];
//设置总页数
_pageControl.numberOfPages = _imageCount;
[self.view addSubview:_pageControl];
}
#pragma mark 添加信息描述控件
-(void)addLabel {
_label = [[UILabel alloc] initWithFrame:CGRectMake(0, 20, SCREEN_WIDTH, 20)];
// _label.backgroundColor = [UIColor orangeColor];
_label.textAlignment = NSTextAlignmentCenter;
_label.textColor = [UIColor colorWithRed:0 green:150/255.0 blue:1 alpha:1];
[self.view addSubview:_label];
}
#pragma mark 滚动停止事件
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
//重新加载图片
[self reloadImage];
//移动到中间
[_scrollView setContentOffset:CGPointMake(SCREEN_WIDTH, 0)];
//设置分页
_pageControl.currentPage = _currentImageIndex;
//设置描述
NSString *imageName = [NSString stringWithFormat:@"%i.jpeg",_currentImageIndex];
_label.text = _imageData[imageName];
}
#pragma mark 重新加载图片
-(void)reloadImage {
int leftImageIndex,rightImageIndex;
CGPoint offset = [_scrollView contentOffset];
if (offset.x > SCREEN_WIDTH) { //向右滑动
_currentImageIndex = (_currentImageIndex+1)%_imageCount;
}else if(offset.x < SCREEN_WIDTH) { //向左滑动
_currentImageIndex = (_currentImageIndex+_imageCount-1)%_imageCount;
}
_centerImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%i.jpeg",_currentImageIndex]];
//重新设置左右图片
leftImageIndex = (_currentImageIndex+_imageCount-1)%_imageCount;
rightImageIndex = (_currentImageIndex+1)%_imageCount;
_leftImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%i.jpeg",leftImageIndex]];
_rightImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%i.jpeg",rightImageIndex]];
}
@end
iOS之UIScrollView循环滚动的更多相关文章
- IOS实现自动循环滚动广告--ScrollView的优化和封装
一.问题分析 在许多App中,我们都会见到循环滚动的视图,比如广告,其实想实现这个功能并不难,用ScrollView就可以轻松完成,但是在制作的过程中还存在几个小问题,如果能够正确的处理好这些小问题, ...
- UIScrollView循环滚动1
现在基本每一个商业APP都会有循环滚动视图,放一些轮播广告之类的,都是放在UIScrollView之上.假如我要实现N张图片的轮播,我借鉴了几个博文,得到两种方法实现: [第一种]:如下图(图片来源于 ...
- UIScrollView 循环滚动,代码超简单
如今非常多应用里面多多少少都用到了循环滚动,要么是图片.要么是view,或者是其它,我总结一下,写了个demo分享给大家. 先看代码之后在讲原理: 1.创建一个空的项目(这个我就不多说了). 2.加入 ...
- iOS判断UIScrollView的滚动方向
- (void) scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat newY = scrollView.contentOffset.y; ...
- IOS无限自动循环滚动banner(源码)
本文转载至 http://blog.csdn.net/iunion/article/details/19080259 目前有很多APP都开始使用一些滚动banner,我自己也做了一个,部分算法没有深 ...
- 使用UIScrollView 结合 UIImageView 实现图片循环滚动
场景: 在开发工作中,有时我们需要实现一组图片循环滚动的情况.当我们使用 UIScrollView 结合 UIImageView 来实现时,一般 UIImageView 会尽量考虑重用,下面例子是以( ...
- UIScrollView实现自动循环滚动广告
实现效果如下: 功能说明: 程序运行,图片自动循环播放,采用定时器实现; 当用户用手势触摸滑动时,定时器的自动播放取消,停止触摸时,自动无限播放; 代码如下 : 采用封装视图,外部进行调用即可: 1. ...
- ios UIPickerView 技巧集锦(包括循环滚动)
摘自: http://blog.csdn.net/ipromiseu/article/details/7436521 http://www.cnblogs.com/dabaopku/archive/2 ...
- Cocos2dx中利用双向链表实现无限循环滚动层
[Qboy原创] 在Cocos2dX 3.0 中已经实现一些牛逼的滚动层,但是对于有一些需要实现循环滚动的要求确没有实现,笔者在前段时间的一个做了一个游戏,需求是实现在少有的(13个)英雄中进行循环滚 ...
随机推荐
- 应用程序框架实战十五:DDD分层架构之领域实体(验证篇)
在应用程序框架实战十四:DDD分层架构之领域实体(基础篇)一文中,我介绍了领域实体的基础,包括标识.相等性比较.输出实体状态等.本文将介绍领域实体的一个核心内容——验证,它是应用程序健壮性的基石.为了 ...
- 【记录】JS 获取 URL 中文参数编码
比如 URL:http://www.xxxx.com/中文参数 这个在 js 获取"中文参数"的时候会出现乱码. 解决方法:decodeURIComponent(获取的中文参数);
- spring笔记--依赖注入之针对不同类型变量的几种注入方式
控制反转和依赖注入讲的都是一个概念,只不过是站在了不同的角度,所谓的依赖注入: 是指在运行期,由外部容器动态地将依赖对象注入到组件中.当spring容器启动后,spring容器初始化,创建并管理bea ...
- (十七)WebGIS中距离及面积测量的原理和实现以及坐标转换的简单介绍
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在这一章里我们将讨论基础工具栏中另外两个常用工具:距离测量工 ...
- (十)WebGIS中地理坐标与屏幕坐标间的转换原理
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 地图本身是拥有坐标的,一般可以大致分为平面坐标和经纬度坐标, ...
- Go项目的目录结构
项目目录结构如何组织,一般语言都是没有规定.但Go语言这方面做了规定,这样可以保持一致性,做到统一.规则化比较明确. 1.一般的,一个Go项目在GOPATH下,会有如下三个目录: |--bin |-- ...
- do{...}while(0)的妙用
在学习第一门编程语言时,就已经介绍了顺序分支.条件分支.循环分支.比如循环分支有for.while.do-while语句.在随后的学校及工作中,如果手工循环一般使用for.while,很少使用do-w ...
- ORACLE存储过程调用Web Service
1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...
- 表单填写示例(通过JavaScript访问DOM)
自己写就的代码,再烂也是自己的- 实现代码 <!DOCTYPE html><html lang="en"><head> <meta cha ...
- 【Win10开发】处理PC上的后退键
我们知道在win10手机上和平板上都会有后退键,那么PC上该怎么办呢?没关系我们慢慢揭晓. 如果你已经是UWP的忠实用户,那么肯定会见到如下的后退键. 那么我们如何来做出来呢?, 我们首先打开App. ...