与Android不同,iOS自身并不提供Grid控件,所以只能自己通过算法和UITableView来实现九宫格的效果。如果是布局已经定好了,有多少个格子,那样实现起来确实简单很多。这里主要是说一下,根据从后台获取到的数据,做一个动态的Grid布局。

算法思路很重要。不同于写死的九宫格,动态加载就需要一点点小算法去计算。

1.UITableView的行数计算。既然是动态的,那么行数肯定是不一定会相同的。从后台获取的数据,存储在一个array中,暂且叫做dataSource。按照每行放置3个,那么行数应该是[dataSourcecount]/3。可是如果不能被整除,那么就要用到计算余数的函数fmod(x,y)。通过判断是否有余数来确定最终的行数是多少。如果无余数,行数就是[dataSourcecount]/3;如果有余数,行数就应该是[dataSource count]/3+1。代码如下:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{//每行3个,取余数int n = (int)fmod ((float)[self.dataSouceArray count], 3.0);int munberOfRows = 0;//判断,如果有余数,munberOfRows应该是总数去掉余数除以每行个数再加1所得的值if (n > 0) {munberOfRows = ([self.dataSouceArray count]-(int)fmod ((float)[self.dataSouceArray count], 3.0))/3+1;}//判断,如果无余数,munberOfRows应该是总数除以每行个数所得的值if (n == 0) {munberOfRows = ([self.dataSouceArray count]-(int)fmod ((float)[self.dataSouceArray count], 3.0))/3;}return munberOfRows;}

2.加载 UITableViewCell 。同样要考虑到获取到的数据数量是否能被3整除的因素。如果可以整除,那么就按照每行三个视图的排列,循环加载就可以了。如果不能整除,那么就要将余数先提出来,先按照每行三个视图的排列循环加载,再将余数在下一行进行加载,也就是看成加载两部分。代码如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{static NSString *CellIdentifier = @"CellIdentifier";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];if (!cell) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];//        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;cell.showsReorderControl = YES;cell.selectionStyle = UITableViewCellSelectionStyleNone;//计算总数是否能被3整除,是否有余数int n = (int)fmod ((float)[self.dataSouceArray count], 3.0);//如果有余数,要分两次排列。先要正常排列,余数又分别进行排列。if (n > 0) {if (indexPath.row == ([self.dataSouceArray count]-n)/3) {for (int i = 0; i < n; i ++) {UIButton *gridBtn = [UIButton buttonWithType:UIButtonTypeSystem];gridBtn.frame = CGRectMake(10.0/640.0*self.frame.size.width*(i+1) + 200.0/640.0*self.frame.size.width*i , 20.0/1136.0*self.frame.size.height, 200.0/640.0*self.frame.size.width, 200.0/1136.0*self.frame.size.height);gridBtn.tag = i+indexPath.row*3;[gridBtn setBackgroundColor:[UIColor greenColor]];[gridBtn addTarget:self action:@selector(gridBtnTap:) forControlEvents:UIControlEventTouchUpInside];[cell.contentView addSubview:gridBtn];}}else{for (int i = 0; i < 3; i ++) {UIButton *gridBtn = [UIButton buttonWithType:UIButtonTypeSystem];gridBtn.frame = CGRectMake(10.0/640.0*self.frame.size.width*(i+1) + 200.0/640.0*self.frame.size.width*i , 20.0/1136.0*self.frame.size.height, 200.0/640.0*self.frame.size.width, 200.0/1136.0*self.frame.size.height);gridBtn.tag = i+indexPath.row*3;[gridBtn setBackgroundColor:[UIColor greenColor]];[gridBtn addTarget:self action:@selector(gridBtnTap:) forControlEvents:UIControlEventTouchUpInside];[cell.contentView addSubview:gridBtn];}}}else{//如果无余数,正常排列for (int i = 0; i < 3; i ++) {UIButton *gridBtn = [UIButton buttonWithType:UIButtonTypeSystem];gridBtn.frame = CGRectMake(10.0/640.0*self.frame.size.width*(i+1) + 200.0/640.0*self.frame.size.width*i , 20.0/1136.0*self.frame.size.height, 200.0/640.0*self.frame.size.width, 200.0/1136.0*self.frame.size.height);gridBtn.tag = i+indexPath.row*3;[gridBtn setBackgroundColor:[UIColor greenColor]];[gridBtn addTarget:self action:@selector(gridBtnTap:) forControlEvents:UIControlEventTouchUpInside];[cell.contentView addSubview:gridBtn];}}}return cell;
}

注意了这两个部分,这个问题就基本搞定了。效果也就差不多达到了。(我这里给我的 dataSource 中放置了5个数据)

下面给个传送门,给需要源码的童鞋下载。

如有需要,请点击iOS九宫格Demo下载我写的Demo。希望能帮助到有需要的人。

iOS 实现九宫格效果相关推荐

  1. Android RecyclerView实现九宫格效果

    RecyclerView更加优化的复用机制和方便实现UI效果,几乎替代Listview和GridView的使用.但是分割线的实现,需要自己继承ItemDecoration来绘制. 完整代码已上传至Gi ...

  2. html 实现格子效果,div+css实现九宫格效果

    div+css实现九宫格效果 有3种方法: 1.方法一:把九宫图切割成9张图,用9个div合在一起,改变宽高,实现.优点:兼容性100%支持,缺点div太多,使用不方便. 2.方法二:把九宫图按特定格 ...

  3. ios APP加密探究几维安全iOS 代码混淆效果参考

    几维安全ios代码混淆效果参考: 什么是加密 加密是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,做一些额外的工作.大多数病毒就是基于此原理. 加密作用 加壳的程序可以有效阻止对程序 ...

  4. H5实现九宫格效果抽奖

    最近面试遇到一个场景实现题目: 用h5实现一个类似上图的九宫格效果,点开始后触发抽奖,匀速转两圈,逐渐减速,抽中第三个商品.样式可以简写,适配下移动端,宽度满屏,请提供大概思路就可以. 下面是vue实 ...

  5. 易语言 图片插入超级列表框_科技资讯:在PPT文档中如何将一张图片做成九宫格效果...

    最近关于在PPT文档中如何将一张图片做成九宫格效果在网上的热度是非常高的,很多网友们也都是非常关注在PPT文档中如何将一张图片做成九宫格效果这个事情,为此小编也是在网上进行了一番搜索查阅相关的信息,那 ...

  6. 如何批量制作九宫格效果的视频

    如何批量制作九宫格效果的视频,首先我们在手机上安装应用程序"王者剪辑app",启动软件并进入一键剪辑中的"特效应用"功能, 批量导入或导入一个视频,接着选择&q ...

  7. 防ios的抽屉效果,防qq的抽屉效果

    AS中导入GitHub开源项目SlidingMenu总结,我开始AS导入SlidingMenu的时候也百度了很多文章,写的都不是很详细,所以导入成功后,写了这篇文章,希望对想用AndroidStudi ...

  8. 移动端阻止ios弹性滑动_移动端iOS阻止橡皮筋效果

    一.遇到的问题 移动端开发中,iOS的微信浏览器也好.Safari也好在浏览网页的时候会出现橡皮筋效果.就是当页面拉到尽头的时候还能再继续拉动,露出浏览器的底色,松手会回弹回去. 微信浏览器: Saf ...

  9. iOS 转盘动画效果实现

    代码地址如下: http://www.demodashi.com/demo/11598.html 近期公司项目告一段落,闲来无事,看到山东中国移动客户端有个转盘动画挺酷的.于是试着实现一下,看似简单, ...

最新文章

  1. IDEA 小技巧之书签与收藏
  2. 在分析了AI顶会上的6163篇论文后,我们能发现怎样的发展趋势与变化……
  3. Polycom开启“创新协作+”时代 全新解决方案闪耀京城
  4. 基于FPGA的costas环同步系统仿真与分析
  5. 没有学过功夫能否练神功
  6. zabbix部署-版本3.2.6
  7. java heroku_Heroku和Java –从新手到初学者,第1部分
  8. 设计模式(十一):从文Finder中认识组合模式(Composite Pattern)
  9. RN react-navigation使用
  10. JS随机打乱数组的方法小结
  11. 大学生河南旅游网页设计成品 学生网页作业我的家乡网页制作代码 静态HTML旅游网页设计作品下载
  12. matlab 分组求平均值,MATLAB:取一个列表中两个数字的平均值?(MATLAB: taking the average of two numbers in a list?)...
  13. 软件Hspice基础知识学习笔记(1)
  14. Power Apps 中调用 Automate 工作流
  15. 脉歌蓝牙耳机线评测_以腔调和功能取胜 脉歌TX90运动挂脖式蓝牙耳机评测
  16. 订阅号做了77天,没有挣钱,但是收获很多。
  17. 胖哥和几个群友写了个好用的OAuth2授权服务器
  18. 央企建筑公司数字化转型最大挑战是什么?如何破解?
  19. 计算机人事管理参考文献,计算机人事管理系统毕业论文设计.doc
  20. 第一天---计算机基础--支润泽

热门文章

  1. 精选SpringBoot笔记,华为19级高工亲撰1700页笔记真的太强了
  2. vue报错@ ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib/selector.js?
  3. C/C++ 趋向于运算符的恶作剧
  4. BroadCast Receiver(广播)详解
  5. 网格(Mesh)基础
  6. 【颜色】Web 颜色记录
  7. 域名该怎么玩?域名玩法介绍
  8. 【优化布局】基于遗传算法求解物流多配送中心选址matlab代码
  9. Frame及窗口切换
  10. web前端开发工具之