博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存优化之封装九宫格
阅读量:6874 次
发布时间:2019-06-26

本文共 4067 字,大约阅读时间需要 13 分钟。

  随着市场上越来越多的APP上线,好多软件对手机的内存要求也是很大,所以我们在开发的时候一定要掌握如何去优化内存,将自己的APP尽可能优化。今天我们就一起看一下九宫格的优化。下面是软件的截图

 

  1、为了达到更好的效果我们不用UITableView,首先我们要通过XIB自定义一个图片和文字如图:

  2、自定义主视图JRMainScrollView,通过协议代理来实现功能,做法和UITableView类似,大家可以参考一下UITableView

  首先:我们要定义数据源协议

//数据源协议@protocol JRMainScrollDataSource 
//获取总的数量- (NSInteger) numberOfItems;//获取列的数量- (NSInteger) numberOfColumsOfRow;//获取item- (UIView *) mainScrollView:(JRMainScrollView *)mainScrollView itemAtIndex:(NSInteger) index;@end

  其次:我们要定义属性协议

//属性协议@protocol JRMainScrollDelegate 
@optional//获取高度- (CGFloat) heightForItemAtView:(JRMainScrollView *) mainScrollView;//获取宽度- (CGFloat) widthForItemAtView:(JRMainScrollView *) mainScrollView;//获取间距- (CGFloat) mainScrollView:(JRMainScrollView *)mainScrollView spaceForItemWithType:(kJRMainScrollItemSpace)type;@end

  注意获取间距包括到左右的间距和上下的间距通过定义一个枚举实现

typedef enum{    kJRMainScrollItemLeftSpace,    kJRMainScrollItemTopSpace} kJRMainScrollItemSpace;

  3、内部布局实现,计算出当前所有的frame,并且放入数组在此期间,用的的属性参数都需要从代理来获取,代码如下

//加载子视图- (void)_loadSubViews{    //获取总个数和列数    NSInteger totalItems=[self.jrDataSource numberOfItems];    NSInteger colum=[self.jrDataSource numberOfColumsOfRow];        //获取宽度和高度    CGFloat itemWidth=[self.jrDelegate widthForItemAtView:self];    CGFloat itemHeigt=[self.jrDelegate heightForItemAtView:self];        //获取上下间距    CGFloat leftSpace=[self.jrDelegate mainScrollView:self spaceForItemWithType:kJRMainScrollItemLeftSpace];    CGFloat topSpace=[self.jrDelegate mainScrollView:self spaceForItemWithType:kJRMainScrollItemTopSpace];        CGFloat space=(kWidth-2*leftSpace-colum*itemWidth)/(colum-1)+itemWidth;        for (int i=0;i

  4、判断当前的frame是不是在当前的屏幕可视范围之内,如果要是在的进行视图的渲染,如果不在不予理睬。

-(void)layoutSubviews{    [super layoutSubviews];        //循环便利获取在屏幕中的frame    for (int i=0;i
=setMiny&&frame.origin.y<=setMaxy; BOOL condition2=CGRectGetMaxY(frame)>=setMiny&&CGRectGetMaxY(frame)<=setMaxy; if(condition1||condition2){ return YES; } return NO; }

  5、操作缓冲池重复利用对象

/** 存放frame*/@property(nonatomic,strong) NSMutableArray * array;/** 存放当前显示的对象*/@property(nonatomic,strong) NSMutableDictionary * current;/** 存放缓冲池对象*/@property(nonatomic,strong) NSMutableSet * pool;/** *  获取重复利用的对象 * *  @param identy <#identy description#> * *  @return <#return value description#> */- (JRRectView *) dequeueReusedItemWithIdenty:(NSString *) identy{    JRRectView * view=[self.pool anyObject];    if (view!=nil) {        [self.pool removeObject:view];    }    return view;}

  6、在主控制器加载视图并实现代理方法即可

//加载所有数据- (void) _loadSubviews{        //1 增加滚动视图    JRMainScrollView * mainScroll=[[JRMainScrollView alloc] initWithFrame:self.view.bounds];    mainScroll.jrDataSource=self;    mainScroll.jrDelegate=self;    [mainScroll reloadViews];    [self.view addSubview:mainScroll];}#pragma mark - 数据源方法-(NSInteger)numberOfItems{    return 132;}-(NSInteger) numberOfColumsOfRow{    return 3;}-(UIView *) mainScrollView:(JRMainScrollView *)mainScrollView itemAtIndex:(NSInteger)index{     JRRectView *cell=[mainScrollView dequeueReusedItemWithIdenty:@"test"];    if (cell==nil) {        cell=[[[NSBundle mainBundle] loadNibNamed:@"rect" owner:nil options:nil] lastObject];    }    cell.titleLabel.text=[NSString stringWithFormat:@"下载"];    NSString * imageName=[NSString stringWithFormat:@"%d",arc4random_uniform(20)+256];    UIImage *image=[UIImage imageNamed:imageName];    cell.image.image=image;    return cell;}#pragma mark - 代理方法//获取高度- (CGFloat)  heightForItemAtView:(JRMainScrollView *) mainScrollView{   return 100;}//获取宽度- (CGFloat)  widthForItemAtView:(JRMainScrollView *) mainScrollView{    return 90;}//获取间距- (CGFloat) mainScrollView:(JRMainScrollView *)mainScrollView spaceForItemWithType:(kJRMainScrollItemSpace)type{        if (type==kJRMainScrollItemLeftSpace) {        return 20;    }else if (type==kJRMainScrollItemTopSpace){        return 20;    }    return 20;    }

 

  想要了解更多内容的小伙伴,可以点击,亲自运行测试。

  疑问咨询或技术交流,请加入官方QQ群: (452379712)

 

作者:
出处:
 
本文版权归和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
 
你可能感兴趣的文章
Nodejs操作MongoDB
查看>>
JavaScript数组的十八般武艺
查看>>
CentOS7 使用yum安装mysql 并配置远程连接
查看>>
Swoole 源码分析——内存模块之swBuffer
查看>>
CORS跨域
查看>>
进行版本迭代过程中,使用spring jpa来完美解决数据表更新的问题
查看>>
分享一个用react-native写的app,适合新手学习react-native
查看>>
React之PureComponent
查看>>
node网络爬虫实例了解下?
查看>>
js对象(一)——创建对象
查看>>
用JavaScript访问SAP云平台上的服务遇到跨域问题该怎么办
查看>>
仅使用NumPy完成卷积神经网络CNN的搭建(附Python代码)
查看>>
position fixed的相对容器是什么
查看>>
MySQL 5.7 Windows安装与配置
查看>>
Swoft 源码剖析 - Swoft 中 AOP 的实现原理
查看>>
在vue2.x项目使用flexible.js和sass
查看>>
node.js学习之npm 入门 ——1.《npm是什么》
查看>>
数据结构JavaScript描述(三)
查看>>
在vue项目中引用element-ui时 让el-input 获取焦点的方法
查看>>
理解React组件生命周期
查看>>