iOS实现九宫格自动生成视图

在移动开发里有相当多的时候需要使控件呈现九宫格格式的分布,最常见的如

图案解锁界面:

相册管理界面:

单独创建一个这样界面的步骤相当繁琐,要创建父视图用于控制每一个单独的控件,而控件添加的时候还要判断每一格的位置,而且代码复用性不高,因为每一种九宫格视图的控件边距,控件的宽高不同。

所以,是否可以写一个这样的模块,只需要提供一个子控件的frame就能够生成一个完整的九宫格视图呢?

以下是我的思路:

首先肯定是用一个类来管理整个模块的,所以创建一个UISodokuView类继承于UIScrollView:
——为什么是scollView?
——因为当需要添加的控件数量较大时,显然会超出手机屏幕范围,只有用scrollView才能完全显示,也就是说,只要用户提供了单个控件的frame、控件数量以及每一行控件的个数,就能够确定UIScrollView的contentSize大小,从而添加。

UISodokuView类

.h文件

@interface UISodokuView : UIScrollView
//基础控件的frame
@property(nonatomic,assign)CGRect itemFrame;
//要添加的控件数量
@property(nonatomic,assign)NSInteger itemsNumber;
//每一行控件数量
@property(nonatomic,assign)NSInteger itemsNumberInOneLine;
//存储控件的array
@property(nonatomic,strong)NSMutableArray *itemsArray;
//scrollView宽度
@property(nonatomic,assign)NSInteger scrollViewWidth;
//scrollView高度
@property(nonatomic,assign)NSInteger scrollViewHeight;

//初始化,但并没有添加控件
-(instancetype)initWithItemFrame:(CGRect)frame andItemsNumber:(NSInteger)itemsNumber andItemsNumberInOneLine:(NSInteger)itemsInOneLine;

这里我添加到scrollView上面每一个控件是一个默认背景为白色的UIView对象,并存储到itemsArray里面,用户想让每一个控件显示什么可以通过获取数组对象进行再添加。

.m文件

@implementation UISodokuView

-(instancetype)initWithItemFrame:(CGRect)frame andItemsNumber:(NSInteger)itemsNumber andItemsNumberInOneLine:(NSInteger)itemsInOneLine{
 self = [super init];
 if (self) {
 //初始化
 _itemsArray = [NSMutableArray array];
 _itemFrame = frame;
 _itemsNumber = itemsNumber;
 _itemsNumberInOneLine = itemsInOneLine;
 self.frame = CGRectZero;
 }
 [self layoutModule];
 return self;
}

-(void)layoutModule{
 //获取item宽高和横向纵向间距
 NSInteger itemWidthGap = _itemFrame.origin.x;
 NSInteger itemHeightGap = _itemFrame.origin.y;
 NSInteger width = _itemFrame.size.width;
 NSInteger height = _itemFrame.size.height;

 //容器宽度
 _scrollViewWidth = itemWidthGap * (_itemsNumberInOneLine + 1) + width * _itemsNumberInOneLine;

 //总行数
 NSInteger numberOfLines = 0;
 if (_itemsNumber%_itemsNumberInOneLine == 0) {
 numberOfLines = _itemsNumber/_itemsNumberInOneLine;
 }else{
 numberOfLines = _itemsNumber/_itemsNumberInOneLine + 1;
 }
 _scrollViewHeight = itemHeightGap*(numberOfLines + 1) + height*numberOfLines - 2;

 //确定scrollView的frame,默认y轴边距200
 self.frame = CGRectMake(0, 200, _scrollViewWidth,height + itemHeightGap*2);
 self.contentSize = CGSizeMake(_scrollViewWidth, _scrollViewHeight);
 self.scrollEnabled = YES;
 self.backgroundColor = [UIColor lightGrayColor];

 //创建并添加控件
 NSInteger line = 1;
 NSInteger row = 1;

 for (int i = 1;i <= _itemsNumber ; i++) {
 UIView *item = [[UIView alloc] initWithFrame:_itemFrame];
 item.backgroundColor = [UIColor whiteColor];
 [_itemsArray addObject:item];
 [self addSubview:item];
 //判断处于第几行
 line = i/_itemsNumberInOneLine + 1;
 //判断处于第几列
 row = i % _itemsNumberInOneLine;
 if (row == 0) {
  row = _itemsNumberInOneLine;
  line -= 1;
 }
 item.frame = CGRectMake(row*itemWidthGap + (row-1)*width, line*itemHeightGap + (line-1)*height, width, height);
 }
}

这里有些数据是默认的:

——scrollView的可视范围:宽度由控件frame确定,高度默认显示一行控件,可滚动,
——scrollView位置默认左边距为0,上边距为200;

这些都可由用户根据自己情况作更改,所以相当方便。

一下是一个使用例子:

UISodokuView * sv = [[UISodokuView alloc] initWithItemFrame:CGRectMake(10, 10, 100, 120) andItemsNumber:10 andItemsNumberInOneLine:3];
 [self.view addSubview:sv];

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 深入解析iOS应用开发中九宫格视图布局的相关计算方法

    来看一个简单的例子: 复制代码 代码如下: /*  * 总列数  */ NSUInteger totalloc = 3; /*  * View的宽高  */ CGFloat shopW = 80; CGFloat shopH = 100; /*  * 每个View之间的间隔  */ CGFloat margin = (self.view.frame.size.width - totalloc * shopW) / (totalloc + 1); /*  * View的总个数  */ NSUInt

  • iOS实现九宫格自动生成视图

    在移动开发里有相当多的时候需要使控件呈现九宫格格式的分布,最常见的如 图案解锁界面: 相册管理界面: 单独创建一个这样界面的步骤相当繁琐,要创建父视图用于控制每一个单独的控件,而控件添加的时候还要判断每一格的位置,而且代码复用性不高,因为每一种九宫格视图的控件边距,控件的宽高不同. 所以,是否可以写一个这样的模块,只需要提供一个子控件的frame就能够生成一个完整的九宫格视图呢? 以下是我的思路: 首先肯定是用一个类来管理整个模块的,所以创建一个UISodokuView类继承于UIScrollV

  • iOS Xcode创建文件时自动生成的注释方法

    之前换了电脑,发现用xcode新建文件生成的注释变成了我不想要的效果(如下图) 一.修改系统默认注释 下面分别描述一下"创建者"."创建时间"."机构名称"以及"类名前缀"如何编辑. 1.编辑创建者: 进入路径:系统偏好设置/用户与群组/右击当前用户进入"高级选项" 编辑"全名"为需要的名称,如图: 2.编辑"创建时间"格式: 进入路径:系统偏好设置/日期与时间/打开

  • iOS进阶之xib上控件自动生成纯代码

    最近公司写了一新项目,写完项目总结时发现,大部分时间都浪费在纯代码写一些简单的控件上,用xib布局吧,还怕为后期的维护给自己挖坑,总是纠结到底用纯代码,还是xib呢,纠结来纠结去突然灵感乍现? 为什么不能用xib布局,让它自动生成相应的代码呢,安卓就有这类似的功能- -!!想到就着手开干,写了一个自动生成的工具,废话不多说介绍下我自己写的小工具 因为还不成熟,就先不发布到cocoapods 了,就一个动态库,直接拖进工程即可,有兴趣的小伙伴可以到网盘下载体验一下 demo下载地址 下面介绍下怎么

  • 浅谈iOS中三种生成随机数方法

    ios 有如下三种随机数方法: //第一种 srand((unsigned)time(0)); //不加这句每次产生的随机数不变 int i = rand() % 5; //第二种 srandom(time(0)); int i = random() % 5; //第三种 int i = arc4random() % 5 ; 注: ① rand()和random()实际并不是一个真正的伪随机数发生器,在使用之前需要先初始化随机种子,否则每次生成的随机数一样. ② arc4random() 是一个

  • IOS 自定义UICollectionView的头视图或者尾视图UICollectionReusableView

    IOS 自定义UICollectionView的头视图或者尾视图UICollectionReusableView 其实看标题就知道是需要继承于UICollectionReusableView,实现一个满足自己需求的视图.那么如何操作了,看下面代码: ViewController.m文件中 #import "ViewController.h" #import "LSHControl.h" #import "SHCollectionReusableView.h

  • 使用Mybatis Generator结合Ant脚本快速自动生成Model、Mapper等文件的方法

    MyBatis简介: MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 相关阅读:MyBatis入门学习教程(一)-MyBatis快速入门 使用过Mybatis的同学都知道,针对每一个项目中使用到的数据库表都需要建

  • Laravel 自动生成验证的实例讲解:login / logout

    Laravel 自动授权讲解 看到这部分文档,经常看见的一句话就是php artisan make:auth,经常好奇这段代码到底干了什么,现在就来扒一扒. 路由 路由文件中会新加入以下内容: Auth::routes(); Route::get('/home','HomeController@index')->name('home'); 首先先是Auth::route();,这句代码等于以下全部设置(文件位置是\Illuminate\Routing\Router.php): /** * Reg

  • IDEA 自动生成 JPA 实体类的图文教程

    目录 1.连接数据库(mysql) 1.1 打开 MySQL 1.2 配置 DataSource 和 Driver 1.3 结果展示 2.生成实体类的设置 2.1 File → Project Structure,给项目添加JPA 2.2 打开persistence视图 2.3 配置 Database Scheme 2.4 生成的实体类,是这样的 2.5 解决生成类报错问题(消除红色波浪线) idea连接oracle使用jpa自动生成实体类 1.连接数据库(mysql) 1.1 打开 MySQL

  • webpack如何自动生成网站图标详解

    目录 介绍 准备 使用 兼容 结语 介绍 我们在自己搭建项目的时候,有时候主管给你一张logo图片,让你自己想办法变成网站图标,有时候项目需求里不仅仅是多种尺寸的favicon.ico,还有安卓和ios在apple-touch-icon这类私有属性的各种尺寸需要icon,其实到是有些在线工具或者本地软件让你去使用,但是就是有点烦躁,有没有考虑过完全无视这个任务,让项目构建打包之后自己生成,不用再去费心了.本期我们就给大家介绍这样一个自动将图片处理成网站图标的插件 —— html-webpack-

  • ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox

    由于某种原因,需要做一个控制grid列显示的checkboxgroup,虽然EXTJS4中的gridpanel自带列表可以来控制列的显示隐藏,但是有这样的需求(需要一目了然) 下面先上图 接着前几天做的工作,今天上午完成了定制字段,思路是在上面的普通查询或者高级查询结束以后,获得了列的fields,columns等信息,然后交给一个处理函数 makeCustomMadePanel,该函数用来生成checkboxgroup,生成的时候给它加上一个事件,原本以为checkbox会有类似于check的

随机推荐