轮播图+性能分析

来源:互联网 发布:自贡网络电视台 编辑:程序博客网 时间:2024/06/08 20:01
<h2 id="autoid-4-1-0" style="font-size: 21px; letter-spacing: -1px; margin: 24px 0px 12px; padding: 6px 0px; line-height: 21px; color: rgb(51, 51, 51); font-family: Georgia, 'Times New Roman', Times, sans-serif; background-image: none; background-position: 0% 100%; background-repeat: repeat-x;">如何优化性能?</h2><p style="line-height: 25.2000007629395px; margin: 10px auto; color: rgb(51, 51, 51); font-family: Georgia, 'Times New Roman', Times, sans-serif; font-size: 14px;">无限循环实现了,但是我们知道如果图片过多这些图片势必全部加载到内存,这是我们不愿意看到的,此时我们需要优化上面的方案。其实从上面的方案我们也可以看出端倪,我们完全没必要创建n+2个UIImageView,其实3个已经足够(事实上也可以用两个实现,大家不妨自己思考一下),只要一直保持显示中间的UIImageView,滚动时动态更改三个UIImageView的图片即可。例如三个UIImageView默认放图片5、图片1、图片2,当前显示中间的UIImageView,也就是图片1,。如果向后滚动那么就会显示图片2,当图片2显示完整后迅速重新设置三个UIImageView的内容为图片1、图片2、图片3,然后通过contentOffset设置显示中间的UIImageView,也就是图片2。继续向后看到图片3,当图片3滚动完成迅速重新设置3个UIImageView的内容为图片2、图片3、图片4,然后设置contentOffset显示中间的UIImageView,也就是图片3。当然,向前滚动原理完全一样,如此就给用户一种循环错觉,而且不占用过多内存。</p>
分享一个实现轮播图的效果
#import "KCMainViewController.h"#define SCREEN_WIDTH 320#define SCREEN_HEIGHT 568#define IMAGEVIEW_COUNT 3@interface KCMainViewController ()<UIScrollViewDelegate>{    UIScrollView *_scrollView;    UIImageView *_leftImageView;    UIImageView *_centerImageView;    UIImageView *_rightImageView;    UIPageControl *_pageControl;    UILabel *_label;    NSMutableDictionary *_imageData;//图片数据    int _currentImageIndex;//当前图片索引    int _imageCount;//图片总数}@end@implementation KCMainViewController- (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];    [self.view addSubview:_scrollView];    //设置代理    _scrollView.delegate=self;    //设置contentSize    _scrollView.contentSize=CGSizeMake(IMAGEVIEW_COUNT*SCREEN_WIDTH, SCREEN_HEIGHT) ;    //设置当前显示的位置为中间图片    [_scrollView setContentOffset:CGPointMake(SCREEN_WIDTH, 0) animated:NO];    //设置分页    _scrollView.pagingEnabled=YES;    //去掉滚动条    _scrollView.showsHorizontalScrollIndicator=NO;}#pragma mark 添加图片三个控件-(void)addImageViews{    _leftImageView=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];    _leftImageView.contentMode=UIViewContentModeScaleAspectFit;    [_scrollView addSubview:_leftImageView];    _centerImageView=[[UIImageView alloc]initWithFrame:CGRectMake(SCREEN_WIDTH, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];    _centerImageView.contentMode=UIViewContentModeScaleAspectFit;    [_scrollView addSubview:_centerImageView];    _rightImageView=[[UIImageView alloc]initWithFrame:CGRectMake(2*SCREEN_WIDTH, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];    _rightImageView.contentMode=UIViewContentModeScaleAspectFit;    [_scrollView addSubview:_rightImageView];}#pragma mark 设置默认显示图片-(void)setDefaultImage{    //加载默认图片    _leftImageView.image=[UIImage imageNamed:[NSString stringWithFormat:@"%i.jpg",_imageCount-1]];    _centerImageView.image=[UIImage imageNamed:[NSString stringWithFormat:@"%i.jpg",0]];    _rightImageView.image=[UIImage imageNamed:[NSString stringWithFormat:@"%i.jpg",1]];    _currentImageIndex=0;    //设置当前页    _pageControl.currentPage=_currentImageIndex;    NSString *imageName=[NSString stringWithFormat:@"%i.jpg",_currentImageIndex];    _label.text=_imageData[imageName];}#pragma mark 添加分页控件-(void)addPageControl{    _pageControl=[[UIPageControl alloc]init];    //注意此方法可以根据页数返回UIPageControl合适的大小    CGSize size= [_pageControl sizeForNumberOfPages:_imageCount];    _pageControl.bounds=CGRectMake(0, 0, size.width, size.height);    _pageControl.center=CGPointMake(SCREEN_WIDTH/2, SCREEN_HEIGHT-100);    //设置颜色    _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, 10, SCREEN_WIDTH,30)];    _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) animated:NO];    //设置分页    _pageControl.currentPage=_currentImageIndex;    //设置描述    NSString *imageName=[NSString stringWithFormat:@"%i.jpg",_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;    }    //UIImageView *centerImageView=(UIImageView *)[_scrollView viewWithTag:2];    _centerImageView.image=[UIImage imageNamed:[NSString stringWithFormat:@"%i.jpg",_currentImageIndex]];        //重新设置左右图片    leftImageIndex=(_currentImageIndex+_imageCount-1)%_imageCount;    rightImageIndex=(_currentImageIndex+1)%_imageCount;    _leftImageView.image=[UIImage imageNamed:[NSString stringWithFormat:@"%i.jpg",leftImageIndex]];    _rightImageView.image=[UIImage imageNamed:[NSString stringWithFormat:@"%i.jpg",rightImageIndex]];}@end

0 0
原创粉丝点击