UI之03应用管理

展示效果图

Snip20160307_1.png

**学习的知识点: **

1.纯代码方式实现九宫格

  • 一个格子一个格子添加
  • 使用for循环添加

2.字典转模型

  • 什么是模型
  • 好处分析
  • 将字典转换为模型
  • 模型提供字典转模型的构造方法

3.使用xib文件

  • 用来描述九宫格
  • 用来描述中间的提示信息

4.封装

  • 纯代码的封装
  • xib的封装

1. 分析:

  • 上面的图标展示的为九宫格样式
  • 上面的每一个图标里面都包含UIImage\Lable\Button

以上的几个特点:

  • 九宫格: 我们可以利用整个屏幕的宽度减去三个应用的宽度减去两边的宽度就等于三个应用之间的宽度
  • 每一个图标包含三个控件, 这里面我们就牵扯到我们的一个新的知识点xib文件

而我们的这个知识点,就是利用应用管理这个软件来介绍的

2. 具体分析(知识点解答):


1. 什么是Xib文件?

我们之前学的storyboard是描述软件界面的,重量级的,一般整一个软件的所有界面

我们的xib同样地用来描述我们的软件界面的,轻量级的,一般用来描述局部界面

我们一般是选用这个empty界面

  • 然后我们应该在这个界面中创建一个UIView
  • 尺寸我们选择的是freedom(自由调整大小)
  • 我们这个xib是面向我们开发者,而面向我们的用户是Nib,这就是为什么我们上面说了xib却使用我们的Nib名了
Snip20160307_2.png

我们一旦增加了, 这个文件之后, 我们还要在这个里面增加一个UIView

Snip20160307_3.png

2. Xib文件的设计:

Snip20160307_4.png

这个就是我们设计的Xib文件
注意:类似于我们的storyboard我们也需要给我们的这个Xib文件(命名为AppView)设置一个控制器:

Snip20160307_6.png

当然, 我们在增加这个控制器之后, 我们需要在这个位置, 写上, 我们AppView的控制器:

Snip20160307_7.png

这个之后, 就是连线

3. plist文件的导入

  • 这个plist文件, 里面装的是我们应用的信息
    虽然, 在这里的, 应用信息比较少, 但是, 以后我们在写程序的时候, 程序的数据量, 会变得很大. 所以, 在这里 , 我们就直接使用plist文件

  • plist文件的导入, 需要我们再增加一个类 , 用于存放我们的数据

Snip20160307_8.png

4. 知识点:

关于, 我们的手机屏幕, 他的坐标是这样的:

Snip20160307_10.png

所以我们的应用坐标计算方法是:

 // 0.总列数(一行最多3列)
int totalColumns = 3;

// 1.应用的尺寸
CGFloat appW = 85;
CGFloat appH = 90;

// 2.间隙 = (控制器view的宽度 - 3 * 应用宽度) / 4
CGFloat marginX = (self.view.frame.size.width - totalColumns * appW) / (totalColumns + 1);
CGFloat marginY = 15;

3. 代码:

**storyboard控制器.m文件中的代码: **

#import "MJViewController.h"
#import "MJApp.h"
#import "MJAppView.h"

@interface MJViewController ()
/** 存放应用信息 */
@property (nonatomic, strong) NSArray *apps;
@end

@implementation MJViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 添加应用信息

    // 0.总列数(一行最多3列)
    int totalColumns = 3;

    // 1.应用的尺寸
    CGFloat appW = 85;
    CGFloat appH = 90;

    // 2.间隙 = (控制器view的宽度 - 3 * 应用宽度) / 4
    CGFloat marginX = (self.view.frame.size.width - totalColumns * appW) / (totalColumns + 1);
    CGFloat marginY = 15;

    // 3.根据应用个数创建对应的框框(index 0 ~ 11)
    for (int index = 0; index<self.apps.count; index++) {
        // 3.1.创建view
        MJAppView *appView = [MJAppView appViewWithApp:self.apps[index]];
    
        // 3.2.添加view
        [self.view addSubview:appView];
    
        // 3.3.设置frame
        int row = index / totalColumns;
        int col = index % totalColumns;
        // 计算x和y
        CGFloat appX = marginX + col * (appW + marginX);
        CGFloat appY = 30 + row * (appH + marginY);
        appView.frame = CGRectMake(appX, appY, appW, appH);

    }
}

- (NSArray *)apps
{
    if (_apps == nil) {
        // 初始化
    
        // 1.获得plist的全路径
        NSString *path = [[NSBundle mainBundle] pathForResource:@"app.plist" ofType:nil];
    
        // 2.加载数组
        NSArray *dictArray = [NSArray arrayWithContentsOfFile:path];
    
        // 3.将dictArray里面的所有字典转成模型对象,放到新的数组中
        NSMutableArray *appArray = [NSMutableArray array];
        for (NSDictionary *dict in dictArray) {
            // 3.1.创建模型对象
            MJApp *app = [MJApp appWithDict:dict];
        
            // 3.2.添加模型对象到数组中
            [appArray addObject:app];
        }
    
        // 4.赋值
        _apps = appArray;
    }
    return _apps;
}

@end

**我们plist文件专用的模型类中的代码: **

**.h文件中的代码: **

#import <Foundation/Foundation.h>

/**
 copy : NSString
 strong: 一般对象
 weak: UI控件
 assign:基本数据类型
 */

@interface MJApp : NSObject
/**
 *  名称
 */
@property (nonatomic, copy) NSString *name;
/**
 *  图标
 */
@property (nonatomic, copy) NSString *icon;

/**
 *  通过字典来初始化模型对象
 *
 *  @param dict 字典对象
 *
 *  @return 已经初始化完毕的模型对象
 */
- (instancetype)initWithDict:(NSDictionary *)dict;

+ (instancetype)appWithDict:(NSDictionary *)dict;
@end

**.m文件中的代码: **

#import "MJApp.h"

@implementation MJApp
- (instancetype)initWithDict:(NSDictionary *)dict
{
    if (self = [super init]) {
        self.name = dict[@"name"];
        self.icon = dict[@"icon"];
    }
    return self;
}

+ (instancetype)appWithDict:(NSDictionary *)dict
{
    return [[self alloc] initWithDict:dict];
}
@end

AppView控制器的.h代码

#import <UIKit/UIKit.h>

@class MJApp;

@interface MJAppView : UIView

/**
 *  模型数据
 */
@property (nonatomic, strong) MJApp *app;

+ (instancetype)appView;

/**
 *  通过模型数据来创建一个view
 */
+ (instancetype)appViewWithApp:(MJApp *)app;

@end

.m文件

#import "MJAppView.h"
#import "MJApp.h"

@interface MJAppView()
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
@property (weak, nonatomic) IBOutlet UILabel   *nameLabel;
@end

@implementation MJAppView

  + (instancetype)appViewWithApp:(MJApp *)app
{
    NSBundle *bundle = [NSBundle mainBundle];
    // 读取xib文件(会创建xib中的描述的所有对象,并且按顺序放到数组中返回)
    NSArray *objs = [bundle   loadNibNamed:@"MJAppView" owner:nil options:nil];
    MJAppView *appView = [objs lastObject];
    appView.app = app;
    return appView;
}

+ (instancetype)appView
{
    return [self appViewWithApp:nil];
}

- (void)setApp:(MJApp *)app
{
    _app = app;

    // 1.设置图标
    self.iconView.image = [UIImage imageNamed:app.icon];

    // 2.设置名称
    self.nameLabel.text = app.name;
  }

  @end

作者说:

由于本人在学应用管理的时候, 笔记全部写在代码里面了, 不幸的是我自己写的代码不知道怎么就没有了, 所以这个笔记有点粗糙, 这个仅是凭借本人的记忆和李老师的代码写的, 所以, 抱歉啦!!!

下一个是内容是利用超级猜图这个程序来介绍新的知识点, 和回顾这次学的. 敬请期待.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,059评论 4 62
  • 因为要结局swift3.0中引用snapKit的问题,看到一篇介绍Xcode8,swift3变化的文章,觉得很详细...
    uniapp阅读 4,403评论 0 12
  • 有人说,我最近的文章写得看不懂了。 讲真,是因为我最近工作上需要不断研究用户心理,迎合读者需求,越是深谙此道,越是...
    李砍柴阅读 654评论 5 3
  • 最近看到听到最多的几个词:高考 毕业 还有20岁,于是发现曾经那个看起来离自己遥不可及的年纪就突然快要到了。 一年...
    闫米MY阅读 310评论 4 2
  • 今天补听了Spenser的课,一改之前匆匆付了线上的课,然后课程在那躺着睡觉,开了个头听了再也不理,也没有太多愧疚...
    兰紫玫红阅读 412评论 0 1