目的:运用代码搭建一个九宫格模型,上面显示应用icon、应用名字和下载按钮点击按钮以后下载按钮变暗,同时提示信息。

分析:先根据屏幕尺寸计算每个格子合适位置,在每个位置建立一个小得UIView,然后在此UIView上面放UIImageView、UILabel、UIButton 三个控件。在界面的下方设置一个UILabel,透明度属性为0,在点击button后透明度由0变到1,然后在变成0。

效果展示:

1.代码实现:

#define kAppViewW 80    // 每个UIView的宽度
#define kAppViewH 100   // 每个UIView的高度
#define kColCount 3     // 每行的个数
#define kStartY   20    // 起始高度
#define kNo       12    // 应用个数
// 实例化applist文件
- (NSArray *)appList{if (_appList == nil) {NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle ]pathForResource:@"app.plist" ofType:nil]];// 创建一个临时数组NSMutableArray *arrayM = [NSMutableArray array];// 便利数组,一次转换模型for(NSDictionary *dict in array){AppInfo *appInfo = [[AppInfo alloc]initWithDict:dict];[arrayM addObject:appInfo];}_appList = arrayM;// 将临时数组为属性赋值}return _appList;
}- (void)viewDidLoad {
[super viewDidLoad];CGFloat marginX = (self.view.bounds.size.width - kColCount * kAppViewW) / (kColCount + 1);// 每列之间的距离(此处固定为20)CGFloat marginY = 20;for (int i = 0; i < kNo ; i++) {// 所在行数 0 1 2int row = i / kColCount;// 所在列数int col = i % kColCount;// 起始X的坐标CGFloat x = marginX + col * (marginX + kAppViewW);CGFloat y = kStartY + marginY + row * (marginY + kAppViewH);UIView *appView = [[UIView alloc]initWithFrame:CGRectMake(x, y, kAppViewW, kAppViewH)];[self.view addSubview:appView];AppInfo *appInfo = self.appList[i];// 1.UIImageViewUIImageView *icon = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, kAppViewW, 60)];icon.image = [UIImage imageNamed:appInfo.icon];// 设置显示格式icon.contentMode = UIViewContentModeScaleAspectFit;[appView addSubview:icon];// 2.UILabeUILabel *appName = [[UILabel alloc]initWithFrame:CGRectMake(0, CGRectGetMaxY(icon.frame) , kAppViewW, 20)];// 取出名字appName.text = appInfo.name;// 字体大小设置appName.font = [UIFont systemFontOfSize:13.0];// 设置显示格式appName.textAlignment = NSTextAlignmentCenter;[appView addSubview:appName];// 3.设置下载键0UIButton *download = [[UIButton alloc]initWithFrame:CGRectMake(0, CGRectGetMaxY(appName.frame), kAppViewW, 20)];// 背景图片[download setBackgroundImage:[UIImage imageNamed:@"buttongreen"] forState:UIControlStateNormal];[download setBackgroundImage:[UIImage imageNamed:@"buttongreen_highlighted"] forState:UIControlStateHighlighted];// 设置字体[download setTitle:@"下载" forState:UIControlStateNormal];download.titleLabel.font = [UIFont systemFontOfSize:12.0]; // 不区分状态[appView addSubview:download];// 添加按钮监听download.tag = i;[download addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];}}/* 按钮监听方法 */
- (void)click:(UIButton *)button
{//  取出appInfoAppInfo *appInfo = self.appList[button.tag];// 1.添加一个UILable到界面UILabel *lable = [[UILabel alloc]initWithFrame:CGRectMake(80, 500, 160, 40)];lable.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.2];lable.text = [NSString stringWithFormat:@"%@已加入下载列表",appInfo.name];lable.font = [UIFont systemFontOfSize:12.0];lable.textAlignment = 1;[self.view addSubview:lable];// 点击一次后,就禁止点击button.enabled = NO;// 动画设置// 初始透明度 完全透明lable.alpha = 0.0 ;// 动画结束之后删除// ^表示是block 快代码,是一个预先准备好的快代码,可以当做参数传递,在需要的时候执行[UIView animateWithDuration:1.0 animations:^{// 要修改的动画属性lable.alpha = 1.0;} completion:^(BOOL finished) {[UIView animateWithDuration:1.0 animations:^{lable.alpha = 0.0 ;}completion:^(BOOL finished) {// 动画完成后,所做的操作[lable removeFromSuperview];}];}];
}

2.本人感想

1.本例题使用到一个方法,即字典转模型,在需要从字典取出一个图片或者Name时出现输入失误,在调试代码的时候出现错误,例如:

icon.image = [UIImage imageNamed:dict[@"icon]];

如果icon拼写错误,将会报错。首先定义一个AppInfo类,在实现中:

- (id)initWithDict:(NSDictionary *)dict
{self = [super init];if (self) {[self setValuesForKeysWithDictionary:dict];}return self;
}

2.block代码块的解读:使用1.0s的时间让UIView的透明度属性由0(全透明)变到1.0(不透明),然后再有1.0经过1.0s变到0,当完成这动作以后,remove这个UIView。

还有一种常用的动画设置方式:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDelay:1.0];[UIView commitAnimations];

收尾式动画不容易监听结束,也不容易嵌套,所以在此不使用该方式。

3.还有一种可以搭建该界面的方法:利用XIB

首先建立一个XIB文件,New Files  -> User Interface  -> Empty或View

搭建一个尺寸、排布合适的自定义视图,然后在ViewController.m中加载。

// 从XIB加载自定义视图UIView *appView = [[[NSBundle mainBundle] loadNibNamed:@"View" owner:nil options:nil] lastObject];// 设置位置 XIBappView.frame = CGRectMake(x, y, kAppViewW, kAppViewH);[self.view addSubview:appView];

4.软件管理界面(九宫格)相关推荐

  1. 1.用Python写了一个进销存管理的软件~需求分析界面设计数据库设计技术路线选择~

    一.需求分析 总体来说,就是一个在游泳馆使用的进销存管理软件,记录商品的入库.出库情况,以及统计销售的金额等~ 整个系统有三类用户,系统管理员.公司管理员和公司销售员,系统管理员负责录入公司信息以及分 ...

  2. 手机安全卫士——软件管理-用户程序和系统程序

    首先看一下界面: AppManagerActivity .java //软件管理 public class AppManagerActivity extends Activity implements ...

  3. linux应用程序文件丢失,详谈Ubuntu软件管理丢失的功能

    多数人都认为Ubuntu通过Ubuntu Software Center彻底改革了dpkg包管理.毫无疑问,按照多数人标准来看,Software Center肯定是用户友好的呢.但事实真是如此么?本文 ...

  4. MySQL 数据库图形化管理界面应用种草之 Navicat Premium 如何使用

    文章目录 前言 一.工具/原料 二.安装和建立连接 2.1.连接本地数据库 2.2.连接远程数据库 三.Navicat Premium 的"增删改查"功能操作 3.1.数据库操作( ...

  5. Linux进阶之软件管理

    本节内容 一.rpm:管理linux软件程序的 特点:安装方便 不能解决依赖关系 1.安装软件: -i: -v: -h: rpm -ivh 包名 2.卸载软件 -e: 清楚 rpm -e 程序名 3. ...

  6. RedHat系列软件管理(第二版) --脚本安装

    RedHat系列软件管理 --脚本安装 一.解压缩 tar -zxvf webmin-1.700.tar.gz 二.进入相关目录 cd webmin-1.700 三.如果此时执行./configure ...

  7. (二)安装SVN服务器,web管理界面

    总览: 基于Linux centos7 搭建内网服务器,并通过外网访问_紫气东来d的博客-CSDN博客 一.安装svn服务器subversion [root@localhost ~]# ifconfi ...

  8. 为 RSSBus Connect™ 管理界面配置多用户登录

    大多数情况下,因为 RSSBus Connect™出众的稳定性和自动处理能力,用户并不需要经常登入管理界面查看状态.但是在有些特定的用例下(例如,未实现与现有内部系统的集成),用户需要更频繁的获取状态 ...

  9. ead开局 华三inode_03 EAD用户接入-受控软件管理-新华三集团-H3C

    02-03 EAD用户接入-受控软件管理 版本声明:不同产品版本的界面可能存在差异,但是这种差异不影响该案例的使用. 案例下载方法:点击页面右上角"视频资料下载"链接下载附件,解压 ...

最新文章

  1. 在报No suitable driver found for jdbc:mysql情况下,我是如何一步一步实现jmeter成功连接mysql...
  2. shell脚本:一键安装LAMP、LNMP脚本
  3. 使用MNIST数据集,在TensorFlow上实现基础LSTM网络
  4. 微软2013暑期实习笔试题目第5题分析
  5. CPU 硬盘性能到底相差多少
  6. FP error code老是忘记的看这里:只给出最常用的几个。
  7. 怎么把外部参照合并到图纸_CAD图纸中插入的参照底图如何使用
  8. Spring框架----Confinguration和Component-Scan注解
  9. C# 多线程同步和线程通信
  10. 服务器主板阵列创建!创建磁盘阵列RAID0、RAID1图文方法
  11. RESTful源码笔记之RESTful Framework的基本组件
  12. 【KSZ8863】KSZ8863交换机芯片的信息汇总与打板验证结果
  13. 使用计算机粘贴板的步骤,教你查看win7电脑的剪切板使用技巧和位置查看的方法...
  14. presentation健身主题HTML,如何用英文做presentation
  15. Error creating bean with name ‘serverEndpointExporter‘ defined in class path resource
  16. illegal multibyte sequence
  17. KeyTool 和 OpenSSL 相互转换 [转]
  18. 属性子集选择的基本启发方法_【数据挖掘笔记三】数据预处理
  19. 使用 zk-SNARK 的可编程零知识证明:第 1 部分
  20. esp32c3 nvs存取大数组结构体方法

热门文章

  1. 开始做mvc 框架 家庭理财项目。
  2. FZU 2167 大王叫我来巡山呐
  3. linux下如何看网卡是千兆还是百兆的
  4. 我的情绪为何总被他人左右
  5. 中学校园计算机网络设计心得体会,中学校园网络组建论文设计
  6. 根除任务栏天猫618超级狂欢红包广告方法,亲测有用
  7. 华为云数据库 MySQL 内核新特性上线,首家彻底解决用户上云需改造应用的问题
  8. kodi添加局域网计算机,KODI怎么播放局域网内共享的4K电影/视频的图文教程
  9. html 酷狗音乐教程,酷狗音乐使用基础教程|酷狗音乐使用教程_好特教程
  10. 高等工程数学 —— 第二章 (1) Smith标准型与Jordan标准型