#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循环滚动的更多相关文章

  1. IOS实现自动循环滚动广告--ScrollView的优化和封装

    一.问题分析 在许多App中,我们都会见到循环滚动的视图,比如广告,其实想实现这个功能并不难,用ScrollView就可以轻松完成,但是在制作的过程中还存在几个小问题,如果能够正确的处理好这些小问题, ...

  2. UIScrollView循环滚动1

    现在基本每一个商业APP都会有循环滚动视图,放一些轮播广告之类的,都是放在UIScrollView之上.假如我要实现N张图片的轮播,我借鉴了几个博文,得到两种方法实现: [第一种]:如下图(图片来源于 ...

  3. UIScrollView 循环滚动,代码超简单

    如今非常多应用里面多多少少都用到了循环滚动,要么是图片.要么是view,或者是其它,我总结一下,写了个demo分享给大家. 先看代码之后在讲原理: 1.创建一个空的项目(这个我就不多说了). 2.加入 ...

  4. iOS判断UIScrollView的滚动方向

    - (void) scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat newY = scrollView.contentOffset.y; ...

  5. IOS无限自动循环滚动banner(源码)

    本文转载至 http://blog.csdn.net/iunion/article/details/19080259  目前有很多APP都开始使用一些滚动banner,我自己也做了一个,部分算法没有深 ...

  6. 使用UIScrollView 结合 UIImageView 实现图片循环滚动

    场景: 在开发工作中,有时我们需要实现一组图片循环滚动的情况.当我们使用 UIScrollView 结合 UIImageView 来实现时,一般 UIImageView 会尽量考虑重用,下面例子是以( ...

  7. UIScrollView实现自动循环滚动广告

    实现效果如下: 功能说明: 程序运行,图片自动循环播放,采用定时器实现; 当用户用手势触摸滑动时,定时器的自动播放取消,停止触摸时,自动无限播放; 代码如下 : 采用封装视图,外部进行调用即可: 1. ...

  8. ios UIPickerView 技巧集锦(包括循环滚动)

    摘自: http://blog.csdn.net/ipromiseu/article/details/7436521 http://www.cnblogs.com/dabaopku/archive/2 ...

  9. Cocos2dx中利用双向链表实现无限循环滚动层

    [Qboy原创] 在Cocos2dX 3.0 中已经实现一些牛逼的滚动层,但是对于有一些需要实现循环滚动的要求确没有实现,笔者在前段时间的一个做了一个游戏,需求是实现在少有的(13个)英雄中进行循环滚 ...

随机推荐

  1. MVVM框架下,WPF实现Datagrid里的全选和选择

    最近的一个项目是用MVVM实现,在实现功能的时候,就会有一些东西,和以前有很大的区别,项目中就用到了常用的序号,就是在Datagrid里的一个字段,用checkbox来实现. 既然是MVVM,就要用到 ...

  2. 深入理解DOM节点类型第三篇——注释节点和文档类型节点

    × 目录 [1]注释节点 [2]文档类型 前面的话 把注释节点和文档类型节点放在一起是因为IE8-浏览器的一个bug.IE8-浏览器将标签名为"!"的元素视作注释节点,所以文档声明 ...

  3. CSS3制作心形头像

    1.功能需求: 最近有一个基于微信开发的Mobile Web项目,是一个活动页面.功能需求:用户使用微信扫描二维码,然后授权使用微信登录,然后读取用户的昵称和头像,然后显示在一个饼图上面.头像需要有一 ...

  4. 如何用 ajax 连接mysql数据库,并且获取从中返回的数据。ajax获取从mysql返回的数据。responseXML分别输出不同数据的方法。

    开讲前,先说下网上,大部分的关于这方面的博文或者其他什么的,就我自己的感觉,第一说得不详细,第二语言不能很好的被初学者了解. 我这篇博文的标题之所以用了三句,是为了方便其他人好查找: 这里介绍的方法有 ...

  5. 输入URL到展现页面的全过程

    最近在看一本关于网络协议的书<图解HTTP> 当我们在浏览器的地址栏输入 http://www.pwstrick.com ,然后回车,回车这一瞬间到看到页面到底发生了什么呢? 1.  域名 ...

  6. 微信小程序小技巧系列《一》幻灯片,tab导航切换

    作者:gou-tian 来自:github 幻灯片 使用微信小程序原生组件swiper实现. <swiper indicator-dots="{{indicatorDots}}&quo ...

  7. 自己动手丰衣足食之 jQuery 数量加减插件

    引言 做一个手机端的订单相关项目中,其中下订单时需要用到数量加减的控件,可以设置默认值,也可以设置最大值和最小值.使用jQuery这么长时间了,平时很少去编写属于自己的插件,现在编写的时候对立面的一些 ...

  8. web前端学习随笔

    为什么是随笔 好好算下来,学习web前端已有半个月了,这半个月来主要学习的是HTML和CSS部分,期间有困惑,也有解决困惑时的快感,所以想把这段时间感受到的一些东西记下来,因为内容比较杂,所以干脆叫随 ...

  9. [AngularJS] AngularJS系列(5) 中级篇之动画

    目录 CSS定义 JS定义 ng动画实际帮我们在状态切换的时候 添加特定的样式 从而实现动画效果. 一般我们会通过C3来实现具体的动画. CSS定义 ng-if 图(实际上,图并不能展现出什么): H ...

  10. FreeRTOS 中断优先级嵌套错误引发HardFault异常解决(转)

      最近在使用FreeRTOS的时候,突然发现程序在运行了几分钟之后所有的任务都不再调用了,只有几个中断能正常使用,看来是系统挂掉了,连续测试了几次想找出问题,可是这个真的有点不知所措.      我 ...