zoukankan      html  css  js  c++  java
  • iOS开发UI篇—无限轮播(循环利用)

    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)细节处理
    设置分页
      
    调整间距
    隐藏水平滚动条。
    清除其颜色。
  • 相关阅读:
    Programming WCF Services作者序
    《软件设计精要与模式》书评
    Programming WCF Services翻译笔记(九)
    检验团队是否敏捷的四个标准
    Programming WCF Services翻译笔记(八)
    Oracle BIEE (Business Intelligence) 11g 11.1.1.6.0 学习(3)创建一个简单的分析
    oracle express 11g 创建表空间
    vmware8安装win2008 r2后找不到网卡驱动的解决办法
    javascript:巧用eval函数组装表单输入项为json对象
    javascript:二叉搜索树 实现
  • 原文地址:https://www.cnblogs.com/wendingding/p/3888642.html
Copyright © 2011-2022 走看看