iOS学习 - 应用程序管理

//
//  YJAppInfo.h
//  05-应用程序管理的练习
//
//  Created by JACKY-MAC on 15-6-8.
//  Copyright (c) 2015年 www.train.com. All rights reserved.
//  字典转模型

#import <UIKit/UIKit.h>

@interface YJAppInfo : UIView
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *icon;

@property(nonatomic,strong,readonly)UIImage *image;
- (instancetype)initWithDict:(NSDictionary *)dict;
/** 类方法可以快速实例化一个对象 */
+ (instancetype)appInfoWithDict:(NSDictionary *)dict;

+(NSArray *)appList;
@end

//
//  YJAppInfo.m
//  05-应用程序管理的练习
//
//  Created by JACKY-MAC on 15-6-8.
//  Copyright (c) 2015年 www.train.com. All rights reserved.
//

#import "YJAppInfo.h"

@implementation YJAppInfo
@synthesize image = _image;

- (UIImage *)image
{
    if (_image==nil) {
        _image = [UIImage imageNamed:self.icon];
    }
    return _image;
}

- (instancetype)initWithDict:(NSDictionary *)dict
{
    self = [super init];
    if (self) {
         // 用字典给属性赋值,所有与plist键值有关的方法,均在此处!
       // self.name = dict[@"name"];
        //self.icon = dict[@"icon"];

        [self setValuesForKeysWithDictionary:dict];
    }
    return self;
}

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

+(NSArray *)appList
{
    NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"app.plist" ofType:nil]];

    // 创建一个临时数组
    NSMutableArray *arrayM = [NSMutableArray array];

    // 遍历数组,依次转换模型
    for (NSDictionary *dict  in array) {

        YJAppInfo *appInfo = [YJAppInfo appInfoWithDict:dict];

        [arrayM addObject:appInfo];

    }
    return arrayM;
}
@end

//
//  YJAppView.h
//  05-应用程序管理的练习
//
//  Created by JACKY-MAC on 15-6-9.
//  Copyright (c) 2015年 www.train.com. All rights reserved.
// 封装子控件view

#import <UIKit/UIKit.h>
@class YJAppInfo;

@interface YJAppView : UIView

/** 类方法,方便调用视图 */
+ (instancetype)appView;
/** 实例化视图,并使用appInfo设置视图的显示 */
+ (instancetype)appViewWithAppInfo:(YJAppInfo *)appInfo;

//@property (weak, nonatomic) IBOutlet UIButton *button;

// 自定义视图中显示的数据来源是数据模型
// 使用模型设置自定义视图的显示
@property(nonatomic,strong)YJAppInfo *appInfo;
@end

//
//  YJAppView.m
//  05-应用程序管理的练习
//
//  Created by JACKY-MAC on 15-6-9.
//  Copyright (c) 2015年 www.train.com. All rights reserved.
//

#import "YJAppView.h"
#import "YJAppInfo.h"

@interface YJAppView ()
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
@property (weak, nonatomic) IBOutlet UILabel *label;

@end

@implementation YJAppView

// 从XIB来加载自定义视图
+ (instancetype)appView
{
    return [[[NSBundle mainBundle] loadNibNamed:@"YJAppView" owner:nil options:nil] lastObject];
}

+ (instancetype)appViewWithAppInfo:(YJAppInfo *)appInfo
{
    // 1. 实例化一个视图
    YJAppView *view = [self appView];
        // 2. 设置视图的显示
    view.appInfo =appInfo;

    // 3. 返回视图
    return view;
}

- (void)setAppInfo:(YJAppInfo *)appInfo
{
    _appInfo = appInfo;

    self.label.text = appInfo.name;
    self.iconView.image = appInfo.image;
}

- (IBAction)click:(UIButton *)button
{
    // 取出appInfo

   // YJAppInfo *appInfo = self.appList[button.tag];

    // 添加一个UILabel到界面上
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(80, 400, 160, 40)];

    label.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.2];
    label.text = [NSString stringWithFormat:@"成功安装%@",self.appInfo.name];

    label.textAlignment = NSTextAlignmentCenter;
    label.font = [UIFont systemFontOfSize:12.0];

    [self.superview addSubview:label];

    // 动画效果
    // 收尾式动画,修改对象的属性,frame,bounds,alpha
    // 初始透明度,完全透明

    label.alpha = 0.0;

    button.enabled = NO;

    [button setTitle:@"下载完成" forState:UIControlStateNormal];

    // 动画结束之后删除
    // ^ 表示是block,块代码,是一个预先准备好的代码块,可以当做参数传递,在需要的时候执行!
    // 块代码在OC中,使用的非常普遍!

    [UIView animateWithDuration:1.0f animations:^{
        // 要修改的动画属性
        label.alpha = 1.0;
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:3.0 animations:^{
            label.alpha = 0.0;
        } completion:^(BOOL finished) {

            [label removeFromSuperview];
        }];
    }];
}

@end


//
//  YJViewController.m
//  05-应用程序管理的练习
//
//  Created by JACKY-MAC on 15-6-5.
//  Copyright (c) 2015年 www.train.com. All rights reserved.
//主控制器

#import "YJViewController.h"
#import "YJAppInfo.h"
#import "YJAppView.h"

#define kAppViewW 80
#define kAppViewH 90
#define kColCount 3
#define kStartY 20
@interface YJViewController ()
@property(nonatomic,strong)NSArray *appList;
@end

@implementation YJViewController

- (NSArray *)appList
{
    if (_appList == nil) {
        //_appList = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"app.plist" ofType:nil]];
                 // 将临时数组为属性赋值
        _appList = [YJAppInfo appList];
    }
    return _appList;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGFloat marginX = (self.view.bounds.size.width - kColCount * kAppViewW) / (kColCount + 1);
    CGFloat marginY = 10;

    for (int i = 0; i < self.appList.count; i++) {
        // 行  横为行
        // 0, 1, 2 => 0
        // 3, 4, 5 => 1
        int row = i /kColCount;

        // 列  竖为列
        // 0, 3, 6 => 0
        // 1, 4, 7 => 1
        // 2, 5, 8 => 2
        int col = i % kColCount;

        CGFloat x = marginX + col * (marginX + kAppViewW);
        CGFloat y =kStartY + marginY +row * (marginY + kAppViewH);

        // 实现视图内部细节
        YJAppView *appView = [YJAppView appViewWithAppInfo:self.appList[i]];

        appView.frame = CGRectMake(x, y, kAppViewW, kAppViewH);

        [self.view addSubview:appView];
@end
时间: 2024-10-14 10:24:32

iOS学习 - 应用程序管理的相关文章

Android学习-应用程序管理

Android学习-应用程序管理 在前段时间,公司要求做一个Android系统的应用程序管理,要实现卸载程序.清除数据.停止正在运行的服务这几大模块,现在将代码粗略总结如下: 主要运用到的类有 PackageManager ActivityManager ApplicationInfo RunningServiceInfo Method 还有两个android.pm下的源文件用于生成桩,IPackageStatsObserver.java  和 IPackageDataObserver.java

CentOS学习笔记--程序管理

程序管理 一个程序被加载到内存当中运行,那么在内存内的那个数据就被称为程序(process).程序是操作系统上非常重要的概念, 所有系统上面跑的数据都会以程序的型态存在.那么系统的程序有哪些状态?不同的状态会如何影响系统的运行? 程序之间是否可以互相控管等等的,这些都是我们所必须要知道的项目.本节节选自鸟哥的 Linux 私房菜 -- 基础学习篇目录 第十七章.程序管理与 SELinux 初探 什么是程序 (process) 程序 (program):通常为 binary program ,放置

iOS学习之内存管理

1.1 引用计数 Reference Count 1.2 自动引用计数,ARC(Automatic Reference Counting) 1引用计数 引用计数(Reference Count)是一个简单而有效的管理对象生命周期的方式.当我们创建一个新对象的时候,它的引用计数为 1,当有一个新的指针指向这个对象时,我们将其引用计数加 1,当某个指针不再指向这个对象是,我们将其引用计数减 1,当对象的引用计数变为 0 时,说明这个对象不再被任何指针指向了,这个时候我们就可以将对象销毁,回收内存.

2015 IOS 学习笔记 内存管理,页面跳转 ——蓝懿教育

——————————内存管理———————————————— 手动内存管理(MRC)中常用的三个方法 retain:导致内存计数+1 release:导致内存计数-1 copy:复制出来一个新的对象 和之前对象的数据可能一致 但是 不是同一个对象 此对象内存计数是1 autorelease:自动释放 当变量出了自动释放池之后会自动释放 自动释放池在项目中有很多看不见的 属性描述关键字: retain/strong: //如果是retain 会做两件事 //-(void)setNames:(NSM

iOS学习笔记(1)— UIView 渲染和内容管理

iOS学习笔记(1)— UIView 渲染和内容管理 iOS中应用程序基本上都是基于MVC模式开发的.UIView就是模型-视图-控制器中的视图,在iOS终端上看到的.摸到的都是UIView. UIView在屏幕上定义了一个矩形区域和管理区域内容的接口.在运行时,一个视图对象控制该区域的渲染:UIView继承自UIResponder,UIResponder是用来响应事件的类,UIView也具有响应事件的能力.所以说UIView具有三个基本的功能,绘制内容并管理内容的布局,响应用户交互,动画.正是

iOS学习笔记之ARC内存管理

iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其所指向对象的所有权 当某个方法(或函数)有一个指向某个对象的局部变量时,可以称该方法(或函数)拥有该变量所指向的对象,如: int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSSt

Linux 程序设计学习笔记----进程管理与程序开发(下)

转载请注明出处:http://blog.csdn.net/suool/article/details/38419983,谢谢! 进程管理及其控制 创建进程 fork()函数 函数说明具体参见:http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html 返回值:Upon successful completion, fork() shall return 0 to the child process and shall re

黑马程序员--IOS学习笔记--数组及排序

IOS学习笔记 概述: 8_2.改变整型变量的符号 8_2.改变整型变量所占存储空间 8_3.char类型数据存储 8_4.数组的基本概念及分类 8_5.数组元素作为函数参数 8_5.一维数组定义及注意事项 8_6.一维数组初始化 8_7.一维数组一个让人疑惑的问题 8_8.一维数组的引用 8_9.应用:数组遍历 8_10.一维数组的存储方式 8_11.一维数组的地址 8_12.一维数组长度计算方法 8_13.一维数组的越界问题 8_14.应用:找最大值 8_15.数组元素作为函数参数 8_16

Linux 程序设计学习笔记----进程管理与程序开发(上)

转载请注明出处,http://blog.csdn.net/suool/article/details/38406211,谢谢! Linux进程存储结构和进程结构 可执行文件结构 如下图: 可以看出,此ELF可执行文件存储时(没有调入内存)分为代码区.数据区和未出花数据区三部分. 代码区:存放cpu的执行的机器指令. 数据区:包含程序中的已经初始化的静态变量,以及已经初始化的全局变量. 未初始化数据区:存入的是未初始化的全局变量和未初始化的静态变量. 现在在上面的程序代码中增加一个int的静态变量