滚动ScrollView---数组存放图片,设置3个滚动视图,用来滑动多张图片

问题描述:循环滑动切换n多张图片,不事先加载完成,现用现取。

解题思路:将要显示的图片存放在数组中,设置3个滚动视图,左边视图,正在显示的视图,右边视图

实现代码如下:

//  ViewController.m

#import "ViewController.h"

#define kWith self.view.frame.size.width

#define kHeight self.view.frame.size.height

@interface
ViewController () <UIScrollViewDelegate>

//图片名称数组

@property(nonatomic,strong)NSMutableArray * imageNameArray;

//图片视图缓冲池数组

@property(nonatomic,strong)NSMutableArray * imageArray;

//加载滚动视图

@property(nonatomic,weak)
UIScrollView * scrollView;

@end

@implementation ViewController

#pragma mark - 懒加载 imageNameArray

- (NSMutableArray *)imageNameArray

{

if(_imageNameArray==nil)

{

_imageNameArray=[NSMutableArray
array];

}

return
_imageNameArray;

}

#pragma mark - 懒加载 imageArray

- (NSMutableArray *)imageArray

{

if(_imageArray==nil)

{

_imageArray=[NSMutableArray
array];

}

return
_imageArray;

}

#pragma mark - 入口

- (void)viewDidLoad {

[super
viewDidLoad];

//加载数据

[self
_loadData];

//加载子视图

[self
_loadSubViews];

}

#pragma mark - 加载数据---将图片名存入数组

- (void)_loadData

{

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

{

NSString * name=[NSString
stringWithFormat:@"t%d.jpg",i+1];

[self.imageNameArray
addObject:name];  
//添加到存放图片名的数组

//NSLog(@"%@",self.imageNameArray);     //测试代码

}

}

#pragma mark - 加载子视图

- (void)_loadSubViews

{

//定义滚动视图

UIScrollView * scroll=[[UIScrollView
alloc]initWithFrame:self.view.bounds];

//添加三个可滚动的imageView视图
视图总长度为:3*kWith  
其中i*kWith代表每个imageView的起始x值

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

{

UIImageView * imageView=[[UIImageView
alloc]initWithFrame:CGRectMake(i*kWith,
0, kWith,
kHeight)];

imageView.image=[UIImage
imageNamed:self.imageNameArray[i]];

[self.imageArray
addObject:imageView];   
//添加到存放图片的数组

[scroll
addSubview:imageView];           
//添加到滚动视图

}

[self.view
addSubview:scroll];   
//添加到显示视图

//设置滚动视图的属性

scroll.delegate=self;   
//设置代理

scroll.contentSize=CGSizeMake(self.imageNameArray.count*kWith,
0);   
//图片连在一起的总长度 self.imageNameArray.count*kWith

scroll.pagingEnabled=YES;   
//分页显示

scroll.showsHorizontalScrollIndicator=NO;   
//隐藏下面的滑动进度条

self.scrollView=scroll;

}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

{

if (scrollView.contentOffset.x/kWith == (int)(scrollView.contentOffset.x/kWith))

{

NSMutableArray * temArray=[self
getUnusedViewWith:scrollView.contentOffset.x];

if (scrollView.contentOffset.x>0 && scrollView.contentOffset.x<kWith*(self.imageNameArray.count-1))

{

//设置左边的视图

[self
setImageFrameWithImage:temArray[0]
andImageWith:-1];

//设置右边的视图

[self
setImageFrameWithImage:temArray[1]
andImageWith:1];

//如果可利用的视图多了一个,说明中间是空白的

if (temArray.count>2)

{

[self
setImageFrameWithImage:temArray[2]
andImageWith:0];

}

}

else if(scrollView.contentOffset.x==0)

{

[self
setImageFrameWithImage:self.imageArray[0]
andImageWith:0];

[self
setImageFrameWithImage:self.imageArray[1]
andImageWith:1];

}

else

{

[self
setImageFrameWithImage:self.imageArray[0]
andImageWith:0];

[self
setImageFrameWithImage:self.imageArray[1]
andImageWith:-1];

}

}

}

#pragma mark - UIScrollViewDelegate代理需实现的方法---方法二

/*

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

{

//NSLog(@"======");   //测试代码---看是否每滑动一张图片就走一次这个方法

//定义一个(NSMutableArray *)类型的对象来接收 
获取未使用的视图对象

NSMutableArray * temArray=[self getUnusedViewWith:scrollView.contentOffset.x];

if (scrollView.contentOffset.x>0 && scrollView.contentOffset.x<kWith*(self.imageNameArray.count-1))

{

//设置左边的视图

[self setImageFrameWithImage:temArray[0] andImageWith:-1];

//设置右边的视图

[self setImageFrameWithImage:temArray[1] andImageWith:1];

//如果可利用的视图多了一个,说明中间是空白的

if (temArray.count>2)

{

[self setImageFrameWithImage:temArray[2] andImageWith:0];

}

//如果是0
说明滑到最左边去了

}

else if(scrollView.contentOffset.x==0)

{

[self setImageFrameWithImage:self.imageArray[0] andImageWith:0];

[self setImageFrameWithImage:self.imageArray[1] andImageWith:1];

}

else if(scrollView.contentOffset.x==kWith*(self.imageNameArray.count-1))

{

[self setImageFrameWithImage:self.imageArray[0] andImageWith:0];

[self setImageFrameWithImage:self.imageArray[1] andImageWith:-1];

}

}*/

#pragma mark - 设置imageView的属性

- (void) setImageFrameWithImage: (UIImageView *)image andImageWith: (NSInteger)
flag

{

//设置frame

CGFloat space=flag*kWith;

CGFloat X=self.scrollView.contentOffset.x+space;

image.frame=CGRectMake(X,
0, kWith,
kHeight);

//设置图片

NSInteger imageIndex=image.frame.origin.x/kWith;

NSLog(@"%g====%ld====%li====%ld",self.scrollView.contentOffset.x,imageIndex,flag,self.imageNameArray.count);

image.image=[UIImage
imageNamed:self.imageNameArray[imageIndex]];

}

#pragma mark - 获取未使用的视图对象

- (NSMutableArray *) getUnusedViewWith: (CGFloat) offX

{

NSMutableArray * temArray=[NSMutableArray
array];

for (int i=0; i<self.imageArray.count; i++)

{

UIImageView * imageView=self.imageArray[i];

//如果X的值和当前的滚动视图不相同则加入到可利用的数组

if (imageView.frame.origin.x!=offX)

{

[temArray
addObject:imageView];

}

}

return temArray;

}

@end

PS:最近在追一部很好看的小说《我和你差之微毫的世界》,作者很懒,不能做到按时更新,所以我常常很急躁的抓心挠肺地盼着作者快点更,现身说法,自己有没有做到按时整理-消化-吸收自己所学的知识呢,又有好几天没有发博客了,罪过啊~以后不管多忙都要按时更新博客,最少两天一更。说到做到!!!

PPS:今天是六一,不管你是小朋友还是大朋友,都要有一颗童心啊~祝六一节快乐~~~

时间: 2024-10-10 07:39:59

滚动ScrollView---数组存放图片,设置3个滚动视图,用来滑动多张图片的相关文章

自动循环滚动ScrollView

// // SBCycleScrollView.h // SBCycleScrollView // // Created by luo.h on 15/7/12. // Copyright (c) 2015年 l.h. All rights reserved. // #import <UIKit/UIKit.h> #import "NSTimer+Addition.h" /** 开启定时器 */ static NSString * const SBCycleScrollVi

iOS无限循环滚动scrollview

经常有园友会问"博主,有没有图片无限滚动的Demo呀?", 正儿八经的图片滚动的Demo我这儿还真没有,今天呢就封装一个可以在项目中直接使用的图片轮播.没看过其他iOS图片无限轮播的代码,也不了解他们的原理,我今天封装这个图片无限轮播是借鉴Web前端中的做法,因为之前写Web前端的时候,实现幻灯片就是这么做的,今天就在iPhone上搞搞.下面的东西是自己写的了,关于轮播的东西这个开源项目也是相当不错的https://github.com/nicklockwood/iCarousel ,

设置tableview的滚动范围--iOS开发系列---项目中成长的知识三

设置tableview的滚动范围 有时候tableview的footerview上的内容需要向上拖动界面一定距离才能够看见, 项目中因为我需要在footerviw上添加一个按钮,而这个按钮又因为这个原因点不中,所以找到了解决办法! 添加如下方法即可 -(void)scrollViewDidScroll:(UIScrollView *)scrollView { self.tableView.contentSize = CGSizeMake(0,MZT_SCREEN_HEIGHT); }

基于HTML5+CSS3的图片旋转、无限滚动、文字跳动特效

本文分享几种基于HTML5+CSS3实现的一些动画特效:图片旋转.无限滚动.文字跳动;实现起来均比较容易,动手来试试! 一.图片旋转 效果图如下: 这个效果实现起来其实并不困难.代码清单如下: <style type="text/css"> #liu{ width:280px; height: 279px; background: url(shishi.png) no-repeat; border-radius:140px; -webkit-animation:run 6s

图片左右循环连续滚动代码,解决marquee的留白问题

<marquee ONMOUSEOUT="this.start()" ONMOUSEOVER="this.stop()" DIRECTION="LEFT" scrollamount=3 behavior="scroll" loop="-1" deplay="0"> <table> <tr> <td> <a href="htt

设置Listview不滚动

scrollview和listview的滑动事件会冲突,所以我们设置listview不滚动就可以 public class ExplosiveListView extends ListView { public ExplosiveListView(Context context) { super(context); // TODO Auto-generated constructor stub } // 设置不滚动 public void onMeasure(int widthMeasureSp

iOS开发中的错误整理,启动图片设置了没有效果;单独创建xib需要注意的事项;图片取消系统渲染的快捷方式

一.启动图片设置了没有效果 解决方案:缓存啊!卸了程序重新安装吧!!!!! 二.单独创建xib需要注意的事项 三.图片取消系统渲染的快捷方式

图片设置3D效果

/** * 图片绘制3d效果 * @param srcImage * @param radius * @param border * @param padding * @return * @throws IOException */ public static BufferedImage draw3D(BufferedImage srcImage, int radius, int border, int padding, Color bgColor) throws IOException{ in

jq实现剪裁图片设置为头像

有时候我们需要设置为这样,就是将某些图片设置为剪裁成设置的尺寸:就是这样的 插件的地址: http://www.htmleaf.com/jQuery/Image-Effects/201504211716.html可以兼容ie8的 注意:说一下现在图片的剪裁可以用clip用法就是clip:rect(top right bottom left):在这个img的需要提前设置为position:absolute这样效果才能出来