九宫格布局,用手机输入法时经常见到。先按3行3列写。

代码的实现主要是计算插入图片的位置。

每一张图片的位置和所在的行列密切相关。分析过程如下:

界面:

代码实现

1、把需要的图片资源添加进来

  然后给界面添加两个按钮,一个删除按钮,一个添加按钮。和一个lable表示图片状态。

 // 添加按钮
- (UIButton *)addButtonWithImage:(NSString *)image highImage:(NSString *)highImage disableImage:(NSString *)disableImage frame:(CGRect)frame action:(SEL)action
{
// 创建按钮
UIButton *btn = [[UIButton alloc] init];
// 设置背景图片
[btn setBackgroundImage:[UIImage imageNamed:image] forState:UIControlStateNormal];
[btn setBackgroundImage:[UIImage imageNamed:highImage] forState:UIControlStateHighlighted];
[btn setBackgroundImage:[UIImage imageNamed:disableImage] forState:UIControlStateDisabled];
// 设置位置和尺寸
btn.frame = frame;
// 监听按钮点击
[btn addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];
// 添加按钮
[self.view addSubview:btn];
return btn;
}

2、响应添加按钮

 // 添加
- (void)add
{
// 图片索引
if (_ShopIndex > ) {
return;
} NSLog(@"添加。。。。%ld",_ShopIndex); // 计算每次新 view 的位置
// 每个view 的宽度和高度
CGFloat viewW = ;
CGFloat viewH = ;
// 列数,控制显示的列数,可以修改其他值
NSInteger col = 3;
// 每个view的索引
NSInteger index = self.shopsView.subviews.count;
// 计算间隔
CGFloat margin = (self.shopsView.frame.size.width - col*viewW) / (col - );
// 计算xy坐标值
CGFloat viewX = (index % col ) * (viewW + margin);
CGFloat viewY = (index / col ) * (viewH + ); // 创建一个父控件显示图片和文字
UIView *shopView = [[UIView alloc] init];
shopView.backgroundColor = [UIColor redColor];
shopView.frame = CGRectMake(viewX, viewY, viewW, viewH);
[self.shopsView addSubview:shopView]; // 添加图片
UIImageView *iconView = [[UIImageView alloc] init]; iconView.image = [UIImage imageNamed:_shops[_ShopIndex][@"icon"]];
iconView.frame = CGRectMake(, , viewW, viewH - );
iconView.backgroundColor = [UIColor blueColor];
[shopView addSubview:iconView]; // 添加文字
UILabel *label = [[UILabel alloc] init];
label.text = _shops[_ShopIndex][@"name"];
label.frame = CGRectMake(,, viewW, );
label.font = [UIFont systemFontOfSize:];
label.backgroundColor = [UIColor greenColor];
label.textAlignment = NSTextAlignmentCenter;
[shopView addSubview:label];
// 索引自增
_ShopIndex ++;
[self checkBtn]; }

3、响应删除按钮

 // 删除
- (void)remove
{
// 图片索引
_ShopIndex --;
[self checkBtn]; if(_ShopIndex < )
{
_ShopIndex = ;
return ;
} NSLog(@"删除。。。。%ld",_ShopIndex);
// 删除子控件
[[self.shopsView.subviews lastObject] removeFromSuperview];
}

4、检查按钮状态

如果图片添加完毕,则添加按钮失效,如果一张图片也没有,那么删除按钮失效。

 // 判断按钮状态,
- (void)checkBtn
{
// 添加按钮的状态
self.addBtn.enabled = (self.shopsView.subviews.count < _shops.count);
// 删除按钮的状态
self.removeBtn.enabled = (self.shopsView.subviews.count > );
// 删除完毕
if(self.removeBtn.enabled == NO )
{
self.hudLable.hidden = NO;
self.hudLable.text = @"商品已经删除完毕!!";
[self performSelector:@selector(hideHUD) withObject:nil afterDelay:2.0];
}
// 添加完毕
else if (self.addBtn.enabled == NO && _ShopIndex == )
{
self.hudLable.hidden = NO;
self.hudLable.text = @"商品已经添加完毕!!";
}
// 计时器3
[NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(hideHUD) userInfo:nil repeats:NO];
}

5、隐藏提示信息

- (void)hideHUD
{
// 隐藏 lable
_hudLable.hidden = YES;
} 效果如下:

在add方法中可以修改要显示的列数,来显示多列。

IOS开发学习笔记037-九宫格代码实现的更多相关文章

  1. iOS开发学习笔记:基础篇

    iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境 ...

  2. ios开发学习笔记(1)

    objective-c基础总结 第一二章 1.application:didiFinishLauchingWithOptions:程序启动后立即执行 2.启动界面代码格式:self.window = ...

  3. IOS开发学习笔记039-autolayout 代码实现

    本文转载至 http://www.cnblogs.com/songliquan/p/4548206.html 1.代码实现比较复杂 代码实现Autolayout的步骤 利用NSLayoutConstr ...

  4. iOS开发学习笔记

    1 常用的第三方工具 1.1 iPhone Simulator 测试程序需要模拟器iPhone Simulator 1.2 设计界面需要Interface Builder,Interface Buil ...

  5. ios开发学习笔记(这里一定有你想要的东西,全部免费)

    1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view [ ...

  6. IOS开发学习笔记017-第一个IOS应用

    第一个IOS应用程序,就从最简单的开始吧. 1.先了解一下开发环境,Xcode的相关组成 2.还有模拟器 3.运行与停止按钮 4.新建一个工程 5.看看main函数里都有啥 6.现在来添加一个控件 1 ...

  7. ios开发学习笔记040-autolayout 第三方框架Masonry

    不管是是界面创建约束还是代码创建约束,苹果官方提供的方式都比较繁琐.所以出现了第三方框架. Masonry 在github地址如下: https://github.com/SnapKit/Masonr ...

  8. IOS开发学习笔记026-UITableView的使用

    UITableView的简单使用过程 简单介绍 两种样式 UITableViewStylePlain UITableViewStyleGrouped 数据显示需要设置数据源,数据源是符合遵守协议 &l ...

  9. IOS开发学习笔记021-练习2

    只是简单练习一下,主要是学习里面的思想,处理问题的方法. 不过还有一个问题没想到解决方法. 那就是动态生成的按钮如何绑定按钮事件,请哪位大神指点一下啊.(知道怎么办了,原来是方法addTarget) ...

随机推荐

  1. LAMP stack-5.6.22 (OpenLogic CentOS 7.2)

    平台: CentOS 类型: 虚拟机镜像 软件包: apache2.4.20 mysql5.6.30 php5.6.22 apache application server basic softwar ...

  2. 美国绿卡基础知识:I-539和I-129表格的应用回复新帖

    美国绿卡基础知识:I-539和I-129表格的应用 发布于: 2011/07/25  8:43 am 引用     I-539,就是和万金油类似的表格.不管你是要延期,还是转换身份:不管你是 B-2 ...

  3. windows mysql忘记密码解决方案

    因为mysql很久之前装的,今天突然想用的时候发现密码不记得,怎一个尴尬了得,所以没办法,只能修改一个新的密码.       在此过程中遇到了几个问题      1.没法进入数据库:      2.修 ...

  4. win10蓝牙添加设备无法连接

    解决方法: 打开运行窗口,输入services.msc. 找到蓝牙支持服务(或者Bluetooth Support Service),右键,属性,启动类型选择手动,启动服务. 还不行的话,此电脑右键, ...

  5. leetcode——1

    1. 题目  Two Sum Given an array of integers, find two numbers such that they add up to a specific targ ...

  6. Android(java)学习笔记99:Java虚拟机和Dalvik虚拟机的区别

    Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野.它对内存的高效使用,和在低速CPU上表现出的高性能,确实令 ...

  7. javascript中Array常用方法

    一.基本概念 1.什么是数组 数组就是一组数据的集合 其表现形式就是内存中的一段连续的内存地址 数组名称其实就是连续内存地址的首地址 2.关于js中的数组特点 数组定义时无需指定数据类型 数组定义时可 ...

  8. 【洛谷1993】小K的农场(差分约束系统模板题)

    点此看题面 大致题意: 给你若干组不等式,请你判断它们是否有解. 差分约束系统 看到若干组不等式,应该很容易想到差分约束系统吧. \(A-B≥C\):转换可得\(A-B≥C\) \(A-B≤C\):转 ...

  9. 剑指offer:按之字形顺序打印二叉树(Python)

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 解题思路 先给定一个二叉树的样式: 前段时间 ...

  10. python基础一 day17 作业

    # 3.用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sbname=['alex','wupeiqi','yuanhao','nezha']# def func(item):# r ...