[UI基础][实现]九宫格之应用程序管理
[目标]
1、完成下图所示的View,View中的图片、文字数据从app.list文件读出。
2、思考代码哪里可以进行优化。
[分析]
1、创建控件
整个View分12个部分,其中包含一个 UIImageView、UILabel、UIButton,这三个控件可以作为一个整体
作为subView的子控件。那么先创建12个subView,然后为每个subView添加三个子控件。
view
| ----- subView
| | ---- UIImageView
| | ---- UILabel
| | ---- UIButton
... ...
| ----- subView
| | ---- UIImageView
| | ---- UILabel
| | ---- UIButton
2、为子控件填充数据
控件的图片数据以及文字数据都存储在app.plist文件中,这个文件是存储了字典对象的12个数组,通过mainBundle
获取文件的路径然后创建字典导出数据并加载到相应的控件。
[实现]
1、创建工程,加载必要的素材以及文件到工程。
略
2、创建12个subView
创建一个subView可以分以下几个步骤进行:
//2.1 创建subView
UIView *subView = [[UIView alloc] init];
//2.2 设置subView的frame
subView.frame = CGRectMake(subViewX, subViewY, subViewW, subViewH);
// 3.3.添加subView到控制器的view
[self.view addSubview:subView];
3、为subView加载图片、文字
subView的图片文字属性存储在app.plist文件,首先把这个文件的数据导出到一个数组中。
3.1 添加属性
@interface ViewController ()
/** 存放应用信息 */
@property (nonatomic, strong) NSArray *appData;
@end
3.2 重写appData的getter
- (NSArray *)apps {
if (_apps == nil) {
// 1.获得plist的全路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"app.plist" ofType:nil];
// 2.加载数组
_appData = [NSArray arrayWithContentsOfFile:path];
}
return _appData;
}
现在数据以及导出到appData这个数组中了,而这个数组的元素是字典,根据key分别读出图片文字信息加载到
相应的控件的属性。
3.3 添加图片数据到UIImagView
NSDictionary *appInfo = self.appData[index];
// 3.3.1.添加图片
UIImageView *iconView = [[UIImageView alloc] init];
// 3.3.2 设置frame
iconView.frame = CGRectMake(iconX, iconY, iconW, iconH);
// 3.3.3 设置图片
iconView.image = [UIImage imageNamed:appInfo[@"icon"]];
[subView addSubview:iconView];
3.4 添加Label的文本属性
// 3.4.1 创建Label
UILabel *nameLabel = [[UILabel alloc] init];
// 3.4.2 设置frame
nameLabel.frame = CGRectMake(nameX, nameY, nameW, nameH);
// 设置文字
nameLabel.text = appInfo[@"name"];
// 设置字体
nameLabel.font = [UIFont systemFontOfSize:13];
// 设置文字居中对齐
nameLabel.textAlignment = NSTextAlignmentCenter;
[appView addSubview:nameLabel];
3.4 添加下载按钮
略
至此,整个UI的根据以上的步骤可以完成。全部代码如下
- (void)viewDidLoad
{
[super viewDidLoad]; // 0.总列数(一行最多3列)
int totalColumns = ; // 1.应用的尺寸
CGFloat subViewW = ;
CGFloat subViewH = ; // 2.间隙 = (控制器view的宽度 - 3 * 应用宽度) / 4
CGFloat marginX = (self.view.frame.size.width - totalColumns * subViewW) / (totalColumns + );
CGFloat marginY = ; // 3.根据应用个数创建对应的框框(index 0 ~ 11)
for (int index = ; index<self.appData.count; index++) {
// 3.1.创建1小框框
UIView *subView = [[UIView alloc] init]; // 3.2.计算框框的位置
// 计算行号和列号
int row = index / totalColumns;
int col = index % totalColumns;
// 计算x和y
CGFloat subViewX = marginX + col * (subViewW + marginX);
CGFloat subViewY = + row * (subViewH + marginY);
// 设置frame
subView.frame = CGRectMake(subViewX, subViewY, subViewW, subViewH); // 3.3.添加框框到控制器的view
[self.view addSubview:subView]; // 3.4.添加内部的小控件
// 3.4.0.index位置对应的应用信息
NSDictionary *appInfo = self.appData[index]; // 3.4.1.添加图片
UIImageView *iconView = [[UIImageView alloc] init];
// 设置位置
CGFloat iconW = ;
CGFloat iconH = ;
CGFloat iconX = (subViewW - iconW) * 0.5;
CGFloat iconY = ;
iconView.frame = CGRectMake(iconX, iconY, iconW, iconH);
// 设置图片
iconView.image = [UIImage imageNamed:appInfo[@"icon"]];
[subView addSubview:iconView]; // 3.4.2.添加名字
UILabel *nameLabel = [[UILabel alloc] init];
// 设置位置
CGFloat nameW = subViewW;
CGFloat nameH = ;
CGFloat nameX = ;
CGFloat nameY = iconY + iconH;
nameLabel.frame = CGRectMake(nameX, nameY, nameW, nameH);
// 设置文字
nameLabel.text = appInfo[@"name"];
// 设置字体
nameLabel.font = [UIFont systemFontOfSize:];
// 设置文字居中对齐
nameLabel.textAlignment = NSTextAlignmentCenter;
[subView addSubview:nameLabel]; // 3.4.3.添加下载按钮
UIButton *downloadBtn = [[UIButton alloc] init];
// 设置位置
CGFloat downloadX = ;
CGFloat downloadY = nameY + nameH;
CGFloat downloadW = subViewW - * downloadX;
CGFloat downloadH = ;
downloadBtn.frame = CGRectMake(downloadX, downloadY, downloadW, downloadH);
// 设置默认的背景
UIImage *normalImage = [UIImage imageNamed:@"buttongreen"];
[downloadBtn setBackgroundImage:normalImage forState:UIControlStateNormal];
// 设置高亮的背景
UIImage *highImage = [UIImage imageNamed:@"buttongreen_highlighted"];
[downloadBtn setBackgroundImage:highImage forState:UIControlStateHighlighted];
// 设置按钮的文字
[downloadBtn setTitle:@"下载" forState:UIControlStateNormal];
// 不推荐直接拿到按钮内部的label设置文字
// downloadBtn.titleLabel.text = @"5435345345";
// 设置按钮文字的字体
downloadBtn.titleLabel.font = [UIFont systemFontOfSize:];
[subView addSubview:downloadBtn];
}
} - (NSArray *)appData
{
if (_appData == nil) {
// 初始化 // 1.获得plist的全路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"app.plist" ofType:nil]; // 2.加载数组
_appData = [NSArray arrayWithContentsOfFile:path];
}
return _appData;
}
[UI基础][实现]九宫格之应用程序管理的更多相关文章
- iOS UI基础-4.0应用程序管理
功能与界面 功能分析: 以九宫格的形式展示应用信息 点击下载按钮后,做出相应的操作 步骤分析: 加载应用信息 根据应用的个数创建对应的view 监听下载按钮点击 整个应用界面: 程序实现 思路 UI布 ...
- iOS UI基础-4.1应用程序管理 字典转Model
用模型取代字典 使用字典的坏处 一般情况下,设置数据和取出数据都使用“字符串类型的key”,编写这些key时,编辑器没有智能提示,需要手敲 dict[@"name"] = @&qu ...
- UI基础UIWindow、UIView
UI基础UIWindow.UIView 在PC中,应用程序多是使用视窗的形式显示内容,手机应用也不例外,手机应用中要在屏幕上显示内容首先要创建一个窗口承载内容,iOS应用中使用UIWindow.UIV ...
- CentOS学习笔记--程序管理
程序管理 一个程序被加载到内存当中运行,那么在内存内的那个数据就被称为程序(process).程序是操作系统上非常重要的概念, 所有系统上面跑的数据都会以程序的型态存在.那么系统的程序有哪些状态?不同 ...
- iOS开发UI基础—手写控件,frame,center和bounds属性
iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...
- Android UI基础教程 目录
从csdn下载了这本英文版的书之后,又去京东搞了一个中文目录下来.对照着看. 话说,这本书绝对超值.有money的童鞋看完英文版记得去买中文版的~~ Android UI基础教程完整英文版 pdf+源 ...
- Android项目实战--手机卫士20--拿到已经安装了的程序以及程序管理主界面
好了,之前我们就讲了高级工具里面的短信备份与还原,那么我们高级工具里面的功能就基本上完成的啦,还有一个叫程序锁的功能而已,但我们今天先不做它先,我们先把我们的程序管理这个功能完成先. 先让大家看一下我 ...
- 游戏UI框架设计(三) : 窗体的层级管理
游戏UI框架设计(三) ---窗体的层级管理 UI框架中UI窗体的"层级管理",最核心的问题是如何进行窗体的显示管理.窗体(预设)的显示我们前面定义了三种类型: 普通.隐藏其他.反 ...
- .NET应用程序管理服务AMS设计
AMS全称是Application Management Server即应用程序管理服:由于经常要写些一些应用服务,每次部署和维护都比较麻烦,首先要针对服务编写一个windows服务程序方便系统启动里 ...
随机推荐
- LeetCode——Basic Calculator
Description: Implement a basic calculator to evaluate a simple expression string. The expression str ...
- Hibernate(1)——数据访问层的架构模式<转>
数据库的概念.逻辑.数据模型概念 应用程序的分层体系结构发展 MVC设计模式与四层结构的对应关系 持久层的设计目标 数据映射器架构模式 JDBC的缺点 Hibernate简介 迅速使用Hibernat ...
- 【BZOJ2087】[Poi2010]Sheep 几何+DP
[BZOJ2087][Poi2010]Sheep Description Lyx的QQ牧场养了很多偶数个的羊,他是Vip,所以牧场是凸多边形(畸形).现在因为他开挂,受到了惩罚,系统要求他把牧场全部分 ...
- Charles(网络封包分析工具)
一.what Charles工具是通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析. 它能实现以下 支持SSL代理:截取分析SSL的请求. ...
- angular -- ng-ui-route路由及其传递参数?page页面版
前面有说过 ng-ui-route 使用 script 标签来做,但是很多时候,会通过引入模板页面的方式来实现: 具体代码: <!DOCTYPE html> <html lang=& ...
- 浙江工业大学校赛 画图游戏 BugZhu抽抽抽!!
BugZhu抽抽抽!! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- Webservice实践(七)CXF 与Spring结合+tomcat发布
上一节介绍了如何使用CXF 来发布服务,但是没有介绍使用web 容器来发布,很多项目需要用tomcat 这样的容器来发布.另外本节将介绍CXF 与spring 结合的方法. 一 目标: 1.利用spi ...
- Qt:小项目仿QQ修改头像界面,技术点记录
最近写了一个修改头像功能的UI,布局参考了QQ目前的修改头像界面.如下图 这里主要说明一下两个地方的技术:1.头像图片上层的遮罩层,圆形外部为灰色,内部为全透明:2.上传图片宽高比例可以通过鼠标拖拽移 ...
- s3对象存储
bkstorages 模块帮助你在蓝鲸应用中使用多种文件存储服务作为后端,用于加速静态资源,管理用户上传文件. 自定静态文件 storage 如果通过修改配置文件满足不了你的需求,你随时可以通过继承 ...
- vsftpd文件服务器安装与配置
-d<登入目录>:指定用户登入时的启始目录:. -s<shell>:指定用户登入后所使用的shell: /sbin/nologin指的是不允许login当前Linux系统.当用 ...