iOS开发UI篇—无限轮播(循环利用)

一、无限轮播

1.简单说明

  在开发中常需要对广告或者是一些图片进行自动的轮播,也就是所谓的无限滚动。

  在开发的时候,我们通常的做法是使用一个UIScrollView,在UIScrollView上面添加多个imageView,然后设置imageView的图片,和scrollView的滚动范围。

  以前的做法:


  一般而言,轮播的广告或者是图片数量都不会太多(3~5张)。所以,并不会太多的去考虑性能问题。但是如果图片过多(比如有16张图片,就需要创建16个imageView),那么就不得不考虑性能问题了。

  更甚,如果深入做一个图片浏览的小程序,那么可能会处理成百上千张图片,这会造成极大的内存浪费且性能低下。

图片数量众多:


当用户在查看第一张图片的时候,后面的7张创建的时间太早,且用户可能根本就没机会看见(看完前面几张就没有兴趣再看后面的内容 了)。

优化思路:只有在需要用到的时候,再创建,创建的imageView进行村循环利用。比较好的做法,不论有多少张图片,只需要创建3个imageView就够了。


本文介绍使用Collectionview来实现无限滚动的循环利用。它支持垂直和水平方向上的滚动。

二、实现

1.说明:

CollectionCell的用法和tableViewCell的用法不太一样,CollectionCell

需要注册,告诉它这种标识对应的cell是什么类型的cell,如果缓存池中没有,那么它就检测当时这种标识注册的是什么类型的cell,就会自动创建这种类型的Cell。

2.实现步骤

  (1)向storyboard中添加一个UICollectionView,调整控件的宽高。


  (2)设置其宽高==一张图片的宽高==其一个cell的宽高

    设置cell的格子的大小。其默认为向上滚动的,调整为水平滚动。


  (3)连线,设置其数据源和代理


实现代码:

 1 //  2 // YYViewController.m
 3 // 07-无限滚动(循环利用)
 4 //  5 // Created by apple on 14-8-3.
 6 // Copyright (c) 2014年 yangyong. All rights reserved.
 7 //
 8  9 #import "YYViewController.h" 10 11 @interface YYViewController ()<UICollectionViewDataSource,UICollectionViewDelegate>
12 @property (weak, nonatomic) IBOutlet UICollectionView *collectinView;
13 14 @end 15 16 @implementation YYViewController
17 18 - (void)viewDidLoad
19 {
20  [super viewDidLoad];
21 //注册cell
22 static NSString *ID=@"cell";
23 [self.collectinView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:ID];
24 25 }
26 27 #pragma mark- UICollectionViewDataSource
28 //一共多少组,默认为1组 29 -(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
30 {
31 return 1;
32 }
33 -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
34 {
35 return 16;
36 }
37 38 -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
39 {
40 static NSString *ID=@"cell";
41 UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:ID forIndexPath:indexPath];
42 cell.backgroundColor=YYRandomColor;
43 return cell;
44 }
45 46 #pragma mark-UICollectionViewDelegate
47 @end


    界面展示:


    打印查看有没有实现cell的循环利用。


    可以看出,整个程序中只创建了两个cell。

  (4)展示图片,自定义cell(两种做法,可以使用xib也可以使用代码)。

    自定义一个cell,用来展示图片。


    实现代码:
YYimageCell.h文件

 1 //  2 // YYimageCell.h
 3 // 07-无限滚动(循环利用)
 4 //  5 // Created by apple on 14-8-3.
 6 // Copyright (c) 2014年 yangyong. All rights reserved.
 7 //
 8  9 #import <UIKit/UIKit.h>
10 11 @interface YYimageCell : UICollectionViewCell
12 @property(nonatomic,copy)NSString *icon;
13 @end


YYimageCell.m文件

 1 //  2 // YYimageCell.m
 3 // 07-无限滚动(循环利用)
 4 //  5 // Created by apple on 14-8-3.
 6 // Copyright (c) 2014年 yangyong. All rights reserved.
 7 //
 8  9 #import "YYimageCell.h" 10 11 @interface YYimageCell ()
12 @property(nonatomic,strong)UIImageView *imageView;
13 @end 14 @implementation YYimageCell
15 16 - (id)initWithFrame:(CGRect)frame
17 {
18 self = [super initWithFrame:frame];
19 if (self) {
20 21 UIImageView *imageView=[[UIImageView alloc]init];
22  [self addSubview:imageView];
23 self.imageView=imageView;
24  }
25 return self;
26 }
27 28 -(void)setIcon:(NSString *)icon
29 {
30 _icon=[icon copy];
31 self.imageView.image=[UIImage imageNamed:icon];
32 }
33 34 -(void)layoutSubviews
35 {
36  [super layoutSubviews];
37 self.imageView.frame=self.bounds;
38 }
39 40 @end

  YYViewController.m文件

 1 //  2 // YYViewController.m
 3 // 07-无限滚动(循环利用)
 4 //  5 // Created by apple on 14-8-3.
 6 // Copyright (c) 2014年 yangyong. All rights reserved.
 7 //
 8  9 #import "YYViewController.h" 10 #import "YYimageCell.h" 11 12 #define YYCell @"cell"
13 14 @interface YYViewController ()<UICollectionViewDataSource,UICollectionViewDelegate>
15 @property (weak, nonatomic) IBOutlet UICollectionView *collectinView;
16 17 @end 18 19 @implementation YYViewController
20 21 - (void)viewDidLoad
22 {
23  [super viewDidLoad];
24 //注册cell
25 // static NSString *ID=@"cell"; 26 [self.collectinView registerClass:[YYimageCell class] forCellWithReuseIdentifier:YYCell];
27 28 }
29 30 #pragma mark- UICollectionViewDataSource
31 //一共多少组,默认为1组 32 -(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
33 {
34 return 1;
35 }
36 -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
37 {
38 return 16;
39 }
40 41 -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
42 {
43 // static NSString *ID=@"cell"; 44 YYimageCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:YYCell forIndexPath:indexPath];
45 cell.backgroundColor=YYRandomColor;
46 NSLog(@"%p,%d",cell,indexPath.item);
47 cell.icon=[NSString stringWithFormat:@"minion_%02d",indexPath.item+1];
48 return cell;
49 }
50 51 #pragma mark-UICollectionViewDelegate
52 @end


  界面实现:


  (5)细节处理

设置分页


调整间距


隐藏水平滚动条。


清除其颜色。

时间: 2024-11-17 22:26:27

iOS开发UI篇—无限轮播(循环利用)的相关文章

iOS开发UI篇—无限轮播(循环展示)

一.简单说明 之前的程序还存在一个问题,那就是不能循环展示,因为plist文件中只有五个数组,因此第一个和最后一个之后就没有了,下面介绍处理这种循环展示问题的小技巧. 方法一:使用一个for循环,循环200次,创建200*=1000个模型,且默认程序启动后处在第100组的位置,向前有500个模型,向后也有500个模型,产生一种循环展示的假象. 代码如下: 1 // 2 // YYViewController.m 3 // 07-无限滚动(循环利用) 4 // 5 // Created by ap

iOS开发UI篇—无限轮播(功能完善)

一.自动滚动 添加并设置一个定时器,每个2.0秒,就跳转到下一条. 获取当前正在展示的位置. 1 [self addNSTimer]; 2 } 3 4 -(void)addNSTimer 5 { 6 // NSTimer timerWithTimeInterval:<#(NSTimeInterval)#> target:<#(id)#> selector:<#(SEL)#> userInfo:<#(id)#> repeats:<#(BOOL)#>

iOS开发UI篇—无限轮播(新闻数据展示)

一.实现效果 二.实现步骤 1.前期准备 (1)导入数据转模型的第三方框架MJExtension (2)向项目中添加保存有"新闻"数据的plist文件 (3)导入用到的图片素材 2.步骤和代码 (1)新建一个数据模型 该模型的代码设计如下: YYnews.h文件 1 // 2 // YYnews.h 3 // 08-无限滚动(新闻数据展示) 4 // 5 6 #import <Foundation/Foundation.h> 7 8 @interface YYnews :

iOS开发UI篇—UITableviewcell的性能优化和缓存机制

iOS开发UI篇-UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource的 tableView:cellForRowAtIndexPath:方法来初始化每⼀行 UITableViewCell内部有个默认的子视图:contentView,contentView是UITableViewCell所显示内容的父视图,可显示一些辅助指示视图 辅助指示视图的作⽤是显示一个表示动作的

iOS开发UI篇—popoverController使用注意

iOS开发UI篇-popoverController使用注意 iOS开发UI篇-popoverController使用注意 一.设置尺寸 提示:不建议,像下面这样吧popover的宽度和高度写死. 1 //1.新建一个内容控制器 2 YYMenuViewController *menuVc=[[YYMenuViewController alloc]init]; 3 4 //2.新建一个popoverController,并设置其内容控制器 5 self.popover=[[UIPopoverCo

IOS使用UICollectionView实现无限轮播效果_IOS

一.案例演示 本案例Demo演示的是一个首页轮播的案例,支持手动轮播和自动轮播.知识点主要集中在UICollectionView和NSTimer的使用. 二.知识储备 2.1.UICollectionView横向布局 只需要设置UICollectionViewFlowLayout的scrollDirection为UICollectionViewScrollDirectionHorizontal即可. 2.2.NSTimer的基本使用 NSTimer的初始化: 复制代码 代码如下:  + (NST

iOS开发UI篇:APP主流UI框架结构

一.简单示例 说明:使用APP主流UI框架结构完成简单的界面搭建 搭建页面效果: 开发UI篇:APP主流UI框架结构-"> 查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/OS/extra/

iOS开发UI篇—xib的简单使用实例_IOS

这个博客申请了有一段时间了,觉得好像是该写点什么了.这篇文章主要是关于一些xib的简单的用法,希望可以帮助到刚刚使用xib的新手们. 什么是xib? xib能做什么? 用来描述软件界面的文件. 如果没有xib,所有的界面都需要通过代码来手动创建. 有了xib以后,可以在xib中进行可视化开发,然后加载xib文件的时候,系统自动生成对应的代码来创建界面. 与xib类似的还有storyboard文件.xib和storyboard的比较,一个轻量级一个重量级. 共同点: 都用来描述软件界面.都用Int

iOS开发UI篇—iPad和iPhone开发的比较

一.iPad简介 1.什么是iPad 一款苹果公司于2010年发布的平板电脑 定位介于苹果的智能手机iPhone和笔记本电脑产品之间 跟iPhone一样,搭载的是iOS操作系统 2.iPad的市场情况 截止至2013年10月23日,iPad已经累计销售1.7亿台 在平板市场的占有率高达81% 二.关于iphone和iPad 说明:iPhone是手机,iPad.iPad Mini是平板电脑 iPhone和iPad开发的区别 屏幕的尺寸 \分辨率 UI元素的排布 \设计 键盘 API 屏幕方向的支持