• 可以直接copy运行研究

  • .m头文件和声明的常量(宏和const)

#import "ViewController.h"

// UIScrollView的尺寸

const CGFloat WSCROLL = 300;

const CGFloat HSCROLL = 200;

#define VWSCROLL (self.view.frame.size.width-WSCROLL)/2

#define VHSCROLL self.view.frame.size.height/7

// 图片的数量

#define COUNTImage 6


  • 所有的属性都封装在延展内:保证了封装性,只是给外界提供了数据传输接口,图片的显示和数据源是分开的,因此只是本类使用到的文件可以写在延展内

@interface ViewController ()

// 视图

@property (nonatomic, strong)UIScrollView *scrol;

// 翻页

@property (nonatomic, strong)UIPageControl *page;

// 固定三个视图:每次都显示中间(偏移量为当前UIScrollView的宽度:数组索引为1)

@property (nonatomic, strong)UIImageView *imv_1;

@property (nonatomic, strong)UIImageView *imv_2;

@property (nonatomic, strong)UIImageView *imv_3;

// 数据源:让显示和数据分开

@property (nonatomic, strong)NSMutableArray *arrImages;

// 记录偏移量:判断偏移后显示的图片,即数组的下标

@property (nonatomic, assign)NSInteger currentPage;

@end


  • 具体实现和注释已经很清晰了,多看

/**

*  通过偏移量,只是改变了数组的下标(换图),view还是居中

*/

@implementation ViewController

- (void)viewDidLoad

{

[super viewDidLoad];

// 1.获取数据源:让显示和数据隔离

self.arrImages = [NSMutableArray array];

for (int i = 0; i < COUNTImage; i++)

{

[self.arrImages addObject:[NSString stringWithFormat:@"bailidujuan%i.jpg", i]];

}

// 2.创建UIScrollView

self.scrol = [[UIScrollView alloc] initWithFrame:CGRectMake(VWSCROLL, VHSCROLL, WSCROLL, HSCROLL)];

// - 只是通过偏移量还更换数组内图片,3个视图保证了往左或者往右都会偏移量:减少内存占用

self.scrol.contentSize = CGSizeMake(WSCROLL*3, HSCROLL);

// - 允许分页

self.scrol.pagingEnabled = YES;

// - 隐藏滚动条

self.scrol.showsHorizontalScrollIndicator = NO;

// - 去掉回弹效果

self.scrol.bounces = NO;

// - 创建视图:因为只有三个视图,因此偏移量是两个定值:只是初始化对象

self.imv_1 = [[UIImageView alloc] init];

self.imv_2 = [[UIImageView alloc] init];

self.imv_3 = [[UIImageView alloc] init];

// 3.添加分页标识

self.page = [[UIPageControl alloc] initWithFrame:CGRectMake((self.view.frame.size.width-100)/2, WSCROLL-30, 100, 30)];

// - 确定页数

self.page.numberOfPages = COUNTImage;

// - 清除背景色

//self.page.backgroundColor = [UIColor clearColor];

// - 更换分页颜色

self.page.currentPageIndicatorTintColor = [UIColor purpleColor];

self.page.pageIndicatorTintColor = [UIColor whiteColor]; //切换页

// - 和用户不交互

self.page.userInteractionEnabled = NO;

// - 传递页数需要代理实现

self.scrol.delegate = self;

// - 当前页码

self.currentPage = 0;

// - 默认加载第一张图

[self reloadImage];

// - 添加到视图:先添加UIScrollView再添加UIPageControl,避免分页被覆盖

[self.view addSubview:self.scrol];

[self.view addSubview:self.page];

}


  • 自定义方法只是通过传递下标确定显示的图片

-(void)reloadImage

{

// 根据下标显示图片:每次都显示中间(偏移量为当前UIScrollView的宽度:数组索引三种情况)

// 每次只是在显示对应索引以及它前后的图片:索引的获取需要偏移量contentOffset

// 第一页:

if (!_currentPage)

{

self.imv_1.image = [UIImage imageNamed:[self.arrImages lastObject]];

self.imv_2.image = [UIImage imageNamed:self.arrImages[self.currentPage]];

self.imv_3.image = [UIImage imageNamed:self.arrImages[self.currentPage+1]];

}

// 最后一页

else if (_currentPage == COUNTImage -1)

{

self.imv_1.image = [UIImage imageNamed:self.arrImages[self.currentPage-1]];

self.imv_2.image = [UIImage imageNamed:self.arrImages[self.currentPage]];

self.imv_3.image = [UIImage imageNamed:[self.arrImages firstObject]];

}

// 中间页

else

{

self.imv_1.image = [UIImage imageNamed:self.arrImages[self.currentPage-1]];

self.imv_2.image = [UIImage imageNamed:self.arrImages[self.currentPage]];

self.imv_3.image = [UIImage imageNamed:self.arrImages[self.currentPage+1]];

}

// 每次修改frame:显示数据不为空再给frame赋值

self.imv_1.frame = CGRectMake(0, 0, WSCROLL, HSCROLL);

self.imv_2.frame = CGRectMake(WSCROLL, 0, WSCROLL, HSCROLL);

self.imv_3.frame = CGRectMake(WSCROLL*2, 0, WSCROLL, HSCROLL);

[self.scrol addSubview:self.imv_1];

[self.scrol addSubview:self.imv_2];

[self.scrol addSubview:self.imv_3];

// 让每次切换都能看到三张图:保证流畅性(每次显示的都是中间一张图)

self.scrol.contentOffset = CGPointMake(WSCROLL, 0);

}


  • 确定下标的过程

#pragma mark - ScrollView Delegate

//在滚动结束状态换图:DidEnd

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

// 确定下标:通过判断偏移量改变索引

// 因为只有三个视图,因此偏移量是两个定值

// 向左:偏移量恒为0

if (!self.scrol.contentOffset.x)

{

if (!_currentPage)

{

// 在第0页左移后,集合索引为最后一个对象:

_currentPage = COUNTImage - 1; // self.arrImages.count - 1 = COUNTImage - 1

}

else

{

_currentPage--; // 一直左移,只会走一次if语句直到0

}

}

// 向右:偏移量恒为两倍

if (self.scrol.contentOffset.x == WSCROLL*2)

{

if (_currentPage == COUNTImage - 1)

{

_currentPage = 0; // 在最后一页右移:集合索引就赋值为0

}

else

{

// 一直右移,只会在到达最后一个元素位置走if语句

_currentPage++;

}

}

// 页数即为集合的下标

self.page.currentPage = _currentPage;

// 对应方法显示下标对应的图片

[self reloadImage];

}


  • Xcode自带程序

#pragma mark -

- (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end


初学者整理,思路可能很简单,希望大家可以相互学习

iOS完美版的UIScrollView无缝循环:你值得一看的更多相关文章

  1. Safari 前端开发调试 iOS 完美解决方案

    转http://www.2cto.com/kf/201403/283404.html afari 前端开发调试 iOS 完美解决方案 2014-03-05      0个评论    来源:Safari ...

  2. JavaScript学习笔记——简单无缝循环滚动展示图片的实现

    今天做了一个简单的无缝循环滚动的实例,这种实例在网页中其实还挺常见的,下面分享一下我的学习收获. 首先,无缝滚动的第一个重点就是——动.关于怎么让页面的元素节点动起来,这就得学明白关于JavaScri ...

  3. Expression Blend4经验分享:文字公告无缝循环滚动效果

    这次分享一个类似新闻公告板的无缝循环滚动效果,相信很多项目都会应用到这个效果.之前我也百度了一下,网上的一些Silverlight的文字或图片滚动效果,都是一次性滚动的,如果要做到无缝循环滚动,多数要 ...

  4. unity3d 音频无缝循环

    在我做赛车漂移的时候,漂移的声音断断续续的,搞得我很郁闷 大家可以随便找个音效然后循环播放去仔细听 你会发现当音效播放完成一次之后循环播放第二次时会停顿一下 我做赛车漂移如果中途停顿了体验是非常不好的 ...

  5. iOS开发UI篇—UIScrollView控件实现图片缩放功能

    iOS开发UI篇—UIScrollView控件实现图片缩放功能 一.缩放 1.简单说明: 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScrollView不仅能滚动显示大量内容,还能对 ...

  6. iOS开发UI篇—UIScrollView控件介绍

    iOS开发UI篇—UIScrollView控件介绍 一.知识点简单介绍 1.UIScrollView控件是什么? (1)移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限 ...

  7. iOS开发UI篇—UIScrollView控件实现图片轮播

    iOS开发UI篇—UIScrollView控件实现图片轮播 一.实现效果 实现图片的自动轮播            二.实现代码 storyboard中布局 代码: #import "YYV ...

  8. 【转】 iOS开发UI篇—UIScrollView控件实现图片轮播

    原文:http://www.cnblogs.com/wendingding/p/3763527.html iOS开发UI篇—UIScrollView控件实现图片轮播 一.实现效果 实现图片的自动轮播 ...

  9. HTML多图无缝循环翻页效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. masonry使用问题

    2015年11月3日 coreData的学习练习中复习使用masonry自动布局 masonry自动布局发现问题: 两个控件的相对布局: 如果被参考对象用这个带anchor的属性,就会报这样一个错误: ...

  2. error: invalid 'asm': invalid operand for code 'w'

    google 出结果 http://stackoverflow.com/questions/15623609/including-curl-into-the-android-aosp ........ ...

  3. 转 Oracle 12c 使用scott等普通用户的方法

    一.前言 最近电脑上安装了oracle 12c数据库,想体验下新特性.安装完后,便像11g一样在dos窗口进行下面的操作: SQL*Plus: Release 12.1.0.2.0 Productio ...

  4. java synchronized 线程同步机制详解

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this ...

  5. Android OpenGL ES(十三)通用的矩阵变换指令 .

    Android OpenGL ES 对于不同坐标系下坐标变换,大都使用矩阵运算的方法来定义和实现的.这里介绍对应指定的坐标系(比如viewmodel, projection或是viewport) An ...

  6. JMeter-使用Badboy录制Web测试脚本

    JMeter是纯Java编写的软件功能和性.能测试工具,其录制脚本过于笨拙和复杂.而Badboy是用C++开发的动态应用测试工具,其拥有强大的屏幕录制和回放功能,同时提供图形结果分析功能,刚好弥补了J ...

  7. Loadrunner之文件的上传(八)

    老猪提供: https://mp.weixin.qq.com/s?__biz=MzIwOTMzNDEwNw==&mid=100000013&idx=1&sn=624f5bc74 ...

  8. angular.js简介

    angularJS是一个javaScript框架.可通过<script>标签添加到HTML页面 angular通过指令扩展了HTML,且通过表达式绑定数据到html 当网页加载完毕,Ang ...

  9. 如何获取url访问历史记录

    在院里的群里,有人问了这么一个问题: A页面提交表单到B页面,然后在B页面点了后退,如果在A页面上判断是直接访问的还是后退进去的呢?我不想改B页面. 于是乎本着热心人的想法,我就帮他搞了搞,首先我想到 ...

  10. ubuntu 解压 windows 生成的 zip 文件乱码问题

    在windows上压缩的文件,是以系统默认编码中文来压缩文件.由于zip文件中没有声明其编码,所以linux上的unzip一般以默认编码解压,中文文件名会出现乱码. 有两种方式解决问题:(建议采用方法 ...