滚动视图性能优化的几种方式

目的:

  - 我们每次发布IOS时都会有一些新特性页面,当然还有广告条都会用到滚动视图。那么如何性能优化呢?目前就我所知有两种方案,一种就是常用的2-3张图片重复利用,另一种就是今天主要讲的利用UICollectionView来做。

  - 今天就做一个新特性页面为例

步骤:

  方法一:利用UICollectionView

1.UICollectionView继承UIScrollView,我们要用滚动视图,肯定会用到ScrollView,而如何我们把collectionView中的一个Item当作滚动视图一页来做是否可行呢?

2.创建UICollectionView有一个注意点,就是创建的时候必须要创建一个layout,代码如下

- (instancetype)init
{

    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];

    // 设置滚动方向
    layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;

    // 设置同一行的item间隔
    layout.minimumInteritemSpacing = 0;
    // 设置行之间的间隔
    layout.minimumLineSpacing = 0;

    // 设置单个item的大小
    layout.itemSize = SAMScreenBounds.size;

    return [super initWithCollectionViewLayout:layout];

}

3、下面要思考的就是CollectionView的Cell本身并没有image,这时我们就应该考虑自定义Cell,创建Cell让继承UICollectionViewCell

// 实现懒加载
- (UIImageView *)imageView
{
    if (_imageView == nil) {
        UIImageView *imV = [[UIImageView alloc] initWithFrame:self.bounds];
        _imageView = imV;
        [self.contentView addSubview:_imageView];
    }
    return _imageView;
}

- (void)setImage:(UIImage *)image
{
    _image = image;

    self.imageView.image = image;
}

4.完成数据源协议,基本跟tableView差不多,在此就不多说了,至于为什么用uicollectionView因为省去了性能优化,直接让苹果帮我们做了,下面我会验证。

5.至此一个简单的滚动视图告一段落了!

  方法二:利用2张图片重复利用实现无限滚动

底层思想:

  - 2张图片重复利用的底层思想就是ScrollView的contentSize是三倍的ScrollView的宽度(或者高度,取决于滚动方向),2张图片一张用于显示(visibleView),另一张用于重复利用(reuseView),总是让显示的那张位于ScrollView的滚动范围中间页,如果到两边每次滚动结束就和重利用的滚动位置交换。而重利用的图片控件就是专门用来显示下一张要滚动的视图(在滚动结束前)。

- (void)viewDidLoad {
    [super viewDidLoad];

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

    // 添加ScrollView并设置
    _scrollView.contentSize = CGSizeMake(3 * kWidth, 0);
    _scrollView.contentOffset = CGPointMake(kWidth , 0);
    _scrollView.showsHorizontalScrollIndicator = NO;
    _scrollView.bounces = NO;
    _scrollView.delegate = self;
    _scrollView.pagingEnabled = YES;
    [self.view addSubview:_scrollView];

    // 添加可见的imageView
    _visibleView = [[UIImageView alloc] initWithFrame:CGRectMake(kWidth, 0, kWidth, kHeight)];
    _visibleView.tag = 0;
    _visibleView.image = [UIImage imageNamed:@"00"];
    [_scrollView addSubview:_visibleView];

    //添加重复利用的imageView
    _reuseView = [[UIImageView alloc] init];
    _reuseView.frame = self.view.bounds;
    [_scrollView addSubview:_reuseView];

}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGRect frame = _reuseView.frame;
    CGFloat offsetX = self.scrollView.contentOffset.x;
    int index = 0;

    // 判断最左 或 最右边
    if (offsetX > _visibleView.frame.origin.x) { // 最右

        frame.origin.x = _scrollView.contentSize.width - kWidth;

        /**
         *  这边只是利用tag来获取哪一个图片,要确保不能第一次滚动都+1,必须要要换取位置之后再加1
         */
        index = (int)_visibleView.tag + 1;

        //超过最大数目,这样就重置
        if (index == kCount) { // 最左
            index = 0;
        }
    }else{
        frame.origin.x = 0;
        index = (int)_visibleView.tag - 1;
        if (index < 0) {
            index = kCount - 1;
        }
    }

    // 赋值给reuseView方便交换给visibleView
    _reuseView.tag = index;
    // 让重利用视图加在将要出现的位置
    _reuseView.frame = frame;
    _reuseView.image = [UIImage imageNamed:[NSString stringWithFormat:@"0%d",index]];

    /**
     * 1.滚动结束后交换位置
     * 2.让可见视图出现在中间位置
     * 3.改变contentOffset正好让可见视图出现在屏幕中
     */
    if (offsetX <= 0 || offsetX >= kWidth  * 2) {
        UIImageView *stmpView = _visibleView;
        _visibleView = _reuseView;
        _reuseView = stmpView;

        _visibleView.frame = _reuseView.frame;

        self.scrollView.contentOffset = CGPointMake(kWidth, 0);
    }

}

时间: 2024-12-11 13:46:31

滚动视图性能优化的几种方式的相关文章

JAVA性能优化的五种方式

一,JAVA性能优化之设计优化 设计优化处于性能优化手段的上层.它往往须要在软件开发之前进行.在软件开发之前,系统架构师应该就评估系统可能存在的各种潜在问题和技术难点,并给出合理的设计方案,因为软件设计和系统架构对软件总体设计质量有决定性的影响.所以,设计调优对系统的性能影响也是最大的,假设说,代码优化.JVM优化都是对系统微观层次的"量"的优化,那设计优化就是对系统"质"的优化. 设计优化的一大显著特征是:它能够规避某一个组件的性能问题,而是改良组件的实现;比方:

视图性能优化——索引视图

视图性能优化——索引视图http://blog.csdn.net/eriato/article/details/41039985 索引视图 索引视图有助于提高 T-SQL 的性能 Itzik Ben-Gan T-SQL 是一种允许您以逻辑方式设计请求的语言.这里所说的“逻辑”的意思是,当编写查询时,您指定的是希望获得什么 结果,而不是希望以何种方式 获得结果.对如何处理查询进行设计是查询优化器的工作.您所遇到的需要 T-SQL 解决方案的每个问题通常都有许多不同的解决方案,它们最终会返回同样的结

jQuery代码性能优化的10种方法

1.总是使用#id去寻找element 在jQuery中最快的选择器是ID选择器 ($('#someid')). 这是因为它直接映射为JavaScript的getElementById()方法. 选择单个元素 <div id="content"> <form method="post" action="/"> <h2>Traffic Light</h2> <ul id="traffi

EF5(7) 后台使用SelectListItem传值给前台显示Select下拉框;mvc后台Action接收浏览器传值的4种方式; 后台Action向前台View视图传递数据的四种方式

一:后台使用SelectListItem 传值给前台显示Select下拉框 我们先来看数据库的订单表,里面有3条订单,他们的用户id对应了 UserInfo用户表的数据,现在我们要做的是添加一个Order控制器,显示订单列表,并且在修改订单的时候,把用户的id 用 select 下拉框显示出来,并且可以提交修改数据   1.1 我们通过比较原始的方法,来把数据 传递到前台后,前台使用  循环来显示 select 并且显示是哪个元素被选中 我们在前台的cshtml中,使用 @model 命令 指定

逆向知识第六讲,取摸优化的几种方式

逆向知识第六讲,取摸优化的几种方式 除法讲完之后,直接开始讲 % 运算符在汇编中表现形式 首先C的高级代码贴上来. 高级代码: // Tedy.cpp : Defines the entry point for the console application. // #include "stdafx.h" int main(int argc, char* argv[]) { unsigned Number; scanf("%d",&Number); //防止

iOS中的视图跳转的三种方式(代码跳转,根据桥跳转,按钮跳转)

#import "ViewController.h" #import "SecondViewController.h" @interface ViewController () @property (retain, nonatomic) IBOutlet UITextField *textField; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // D

MySQL数据库优化的八种方式(经典必看)

引言: 关于数据库优化,网上有不少资料和方法,但是不少质量参差不齐,有些总结的不够到位,内容冗杂 偶尔发现了这篇文章,总结得很经典,文章流量也很大,所以拿到自己的总结文集中,积累优质文章,提升个人能力,希望对大家今后开发中也有帮助 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小. 例如,在定义邮政编码这个字段时,如果将其设置为CHAR(2

PHP程序性能优化的50种方法

用单引号代替双引号来包含字符串,这样做会更快一些.因为 PHP 会在双引号包围的 字符串中搜寻变量,单引号则不会,注意:只有 echo 能这么做,它是一种可以把多个字符 串当作参数的“函数”(译注:PHP 手册中说 echo 是语言结构,不是真正的函数,故把函数 加上了双引号). 如果能将类的方法定义成 static,就尽量定义成 static,它的速度会提升将近 4 倍. $row[‘id’] 的速度是$row[id]的 7 倍 echo 比 print 快,并且使用 echo 的多重参数(译

MySQL数据库优化的八种方式

引言: 关于数据库优化,网上有不少资料和方法,但是不少质量参差不齐,有些总结的不够到位,内容冗杂 偶尔发现了这篇文章,总结得很经典,文章流量也很大,所以拿到自己的总结文集中,积累优质文章,提升个人能力,希望对大家今后开发中也有帮助 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小. 例如,在定义邮政编码这个字段时,如果将其设置为CHAR(2