zoukankan      html  css  js  c++  java
  • ios开发-UI基础-应用管理(单纯界面)实现1

      在上篇文章中,在文章最后附上了主要的思路分析.本篇通过代码实现view,imageview,label,button的添加,加载plist数据,使用for循环来完成.

    应用代码结构及plist文件截图:

    下面附上源代码:

    viewController.m

      1 //
      2 //  ViewController.m
      3 //  02-应用管理
      4 //
      5 //  Created by hukezhu on 15/5/14.
      6 //
      7 //
      8 
      9 #import "ViewController.h"
     10 
     11 @interface ViewController ()
     12 @property (nonatomic,strong)NSArray *apps;
     13 @end
     14 
     15 @implementation ViewController
     16 
     17 - (void)viewDidLoad {
     18     [super viewDidLoad];
     19     
     20     //每一行的应用的个数
     21     int totalCol = 3;
     22     
     23     
     24     //添加一个小的view
     25     CGFloat appW = 80;
     26     CGFloat appH = 100;
     27     CGFloat marginX = 20;
     28     CGFloat marginY = 20;
     29     CGFloat hightMargin = 30;
     30     CGFloat leftMargin = (self.view.frame.size.width - totalCol * appW - (totalCol - 1) *marginX)* 0.5;
     31     
     32     
     33     
     34     for (int i = 0; i < self.apps.count; i++) {
     35         
     36         
     37         //计算行号和列号
     38         int row = i / totalCol;
     39         int col = i % totalCol;
     40         
     41         CGFloat appX = leftMargin + (marginX + appW)* col;
     42         CGFloat appY = hightMargin + (marginY + appH)* row;
     43         
     44         //1.添加view
     45         
     46         //1.1新建一个UIView
     47         UIView *appView = [[UIView alloc]init];
     48         //1.2设置frame
     49         appView.frame = CGRectMake(appX, appY, appW, appH);
     50         //1.3设置背景色(便于代码阶段验证,之后会删除)
     51         //appView.backgroundColor = [UIColor redColor];
     52         //1.4将这个appView添加到view中
     53         [self.view addSubview:appView];
     54         
     55         //加载数据
     56         NSDictionary *dict = self.apps[i];
     57         
     58         //2.添加图片UIImageView
     59         CGFloat imageW = 60;
     60         CGFloat imageH = 50;
     61         CGFloat imageX = (appW - imageW)*0.5;
     62         CGFloat imageY = 0;
     63         UIImageView *imageView = [[UIImageView alloc]init];
     64         imageView.frame = CGRectMake(imageX, imageY, imageW, imageH);
     65         //imageView.backgroundColor = [UIColor blueColor];
     66         imageView.image = [UIImage imageNamed:dict[@"icon"]];
     67         [appView addSubview:imageView];
     68     
     69         
     70         //3.添加应用名称
     71     
     72         CGFloat labelW = 80;
     73         CGFloat labelH = 25;
     74         CGFloat labelX = 0;
     75         CGFloat labelY = imageH;
     76         UILabel *label = [[UILabel alloc]init];
     77         label.frame = CGRectMake(labelX, labelY, labelW, labelH);
     78         //label.backgroundColor = [UIColor grayColor];
     79         label.text = dict[@"name"];
     80         //设置字体大小
     81         label.font = [UIFont systemFontOfSize:13];
     82         //设置字体居中
     83         label.textAlignment = NSTextAlignmentCenter;
     84         [appView addSubview:label];
     85         
     86         //4.添加下载按钮
     87         
     88         CGFloat downloadW = 60;
     89         CGFloat downloadH = 25;
     90         CGFloat downloadX = 10;
     91         CGFloat downloadY = labelH + labelY;
     92         UIButton *downloadBtn = [[UIButton alloc]init];
     93         downloadBtn.frame = CGRectMake(downloadX, downloadY, downloadW, downloadH);
     94         //downloadBtn.backgroundColor = [UIColor yellowColor];
     95         //设置背景图片
     96         [downloadBtn setBackgroundImage:[UIImage imageNamed:@"buttongreen"] forState:UIControlStateNormal];
     97         [downloadBtn setBackgroundImage:[UIImage imageNamed:@"buttongreen_highlighted"] forState:UIControlStateHighlighted];
     98         //设置字体
     99         [downloadBtn setTitle:@"下载" forState:UIControlStateNormal];
    100         
    101         //设置字体大小
    102         downloadBtn.titleLabel.font = [UIFont systemFontOfSize:15];
    103         [appView addSubview:downloadBtn];
    104         
    105         
    106         [downloadBtn addTarget:self action:@selector(btnOnClick:) forControlEvents:UIControlEventTouchUpInside];
    107     }
    108     
    109  
    110     
    111     
    112     
    113 }
    114 /**
    115  *  按钮的点击方法
    116  *
    117  *  @param btn 将按钮本身传入方法中,哪个按钮被点击就调用这个方法
    118  */
    119 - (void)btnOnClick:(UIButton *)btn{
    120 
    121     //NSLog(@"------%@",btn);
    122     btn.enabled = NO;
    123     [btn setTitle:@"已下载" forState:UIControlStateNormal];
    124     
    125     CGFloat labelW = 120;
    126     CGFloat labelH = 30;
    127     CGFloat labelX = (self.view.frame.size.width - labelW)* 0.5;
    128     CGFloat labelY = (self.view.frame.size.height - labelH)*0.5;
    129     UILabel *label = [[UILabel alloc]init];
    130     label.frame = CGRectMake(labelX, labelY, labelW, labelH);
    131     label.text = @"正在下载";
    132     //设置字体颜色
    133     label.textColor = [UIColor redColor];
    134     //设置字体居中
    135     label.textAlignment = NSTextAlignmentCenter;
    136     //设置 背景色
    137     label.backgroundColor = [UIColor blackColor];
    138     
    139     //设置圆角的半径
    140     label.layer.cornerRadius = 8;
    141     //将多余的部分减掉
    142     label.layer.masksToBounds = YES;
    143     //设置透明度
    144     label.alpha = 0.0;
    145     //将label添加到view中
    146     [self.view addSubview:label];
    147     //使用block动画,动画持续时间2秒
    148     [UIView animateWithDuration:2.0 animations:^{
    149         label.alpha = 0.5;
    150     } completion:^(BOOL finished) {
    151         if (finished) {
    152             [UIView animateWithDuration:2.0 delay:0.1 options:UIViewAnimationOptionCurveLinear animations:^{
    153                 label.alpha = 0.0;
    154             } completion:^(BOOL finished) {
    155                 //上面将透明度设置为0,界面上已经不显示这个label,但是它仍然在内存中,所以为了节约内存,仍要将其从内存中删除
    156                 [label removeFromSuperview];
    157                 
    158             }];
    159         }
    160     }];
    161     
    162 }
    163 /**
    164  *  "懒加载",加载应用数据
    165  *
    166  */
    167 - (NSArray *)apps{
    168 
    169     //如果_apps为空,才加载数据
    170     if (_apps == nil) {
    171         //获取全路径
    172         NSString *path = [[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil];
    173         //将取出的数据放到_apps中
    174         _apps = [NSArray arrayWithContentsOfFile:path];
    175     }
    176     return _apps;
    177 }
    178 
    179 - (void)didReceiveMemoryWarning {
    180     [super didReceiveMemoryWarning];
    181     // Dispose of any resources that can be recreated.
    182 }
    183 
    184 @end

    主要知识点分析:

      1."懒加载"

        在前几篇文章中已经介绍过这个知识点,这种方式其实就是重写get方法,当用到数据的时候才去加载,可以提高性能.实现思路是:首先判断是否为空,如果为空则去加载,否则直接返回

          2.代码中的常量数据

        在代码中用到的常量数据,最好能够提取出来,便于扩展和修改.

      3.UILabel设置字体方面的方法

    1         UILabel *label = [[UILabel alloc]init];
    2         //设置背景色
    3         label.backgroundColor = [UIColor grayColor];
    4         //label.text = dict[@"name"];
    5         //设置字体大小
    6         label.font = [UIFont systemFontOfSize:13];
    7         //设置字体居中(枚举)
    8         label.textAlignment = NSTextAlignmentCenter;    

      4.UIButton

        我们可以发现在UIButton中可以显示图片和文字,这是因为UIButton中有两个属性为UIImageView和UILabel

    1 // return title and image views. will always create them if necessary. always returns nil for system buttons
    2 @property(nonatomic,readonly,retain) UILabel     *titleLabel NS_AVAILABLE_IOS(3_0);
    3 @property(nonatomic,readonly,retain) UIImageView *imageView  NS_AVAILABLE_IOS(3_0);

        

        假设我们需要修改UIButton上的文字字体大小的时候,可以取出其中的UILabel属性,修改,例如;

            //设置字体大小
            downloadBtn.titleLabel.font = [UIFont systemFontOfSize:15];
    

        

        注意点:

          通过上述分析,我们可以知道,现在修改UIButton上的文字可以有两种方法,第一种是我们之前常用的setTitle:的方法,第二种就是取出其        中的UILabel,给其设置文字,但是我们不推荐使用第二种方法,因为这个不能设置显示字体的状态(普通,高亮,不可用等),如下:

    1         //设置字体第一种方法
    2         [downloadBtn setTitle:@"下载" forState:UIControlStateNormal];
    3         
    4         //设置字体第二种方法(不推荐使用)
    5         downloadBtn.titleLabel.text = @"下载";

      5.设置空间的透明度,调用alpha方法(o为全透明,1为不透明)

      6.设置空间为圆角矩形

    1     //设置圆角的半径(此时赋值不宜过大,数字越大,控件图形两侧越尖)
    2     label.layer.cornerRadius = 8;
    3     //将多余的部分减掉
    4     label.layer.masksToBounds = YES;

      7.block动画

      前面文章中也大体提到过block动画,这种方式使用起来比头尾式简单,好用

      

    1     //使用block动画,动画持续时间2秒
    2     [UIView animateWithDuration:2.0 animations:^{
    3         //执行动画的代码块
    4     } completion:^(BOOL finished) {
    5 
    6       //动画结束之后执行的操作(仍然可以嵌套block)
    7     }];

      总结:这份代码是使用加载plist数据,使用字典来操作数据,这种方式有一定的弊端,在前面文章中已经介绍过(写代码的时候字典的键没有智能提示; "键"是字符串, 如果写错了, 编译器不报错(在编译的时候不报错), 运行时可能出错, 出错了很难排查)。所以下一篇文章,使用字典转模型,使用模型来操作数据,进行改进.

  • 相关阅读:
    关于我成为电脑维修社团一员那些事
    [算法相关]二进制分组
    [题解]陌上花开
    [题解]UVA10917 Walk Through the Forest
    [字符串相关]后缀自动机(SAM)- 一
    [字符串相关]后缀数组
    [字符串相关]Aho-Corasick 自动机
    [算法入门]线性基
    [数据结构]可持久化并查集
    [数据结构]可持久化线段树
  • 原文地址:https://www.cnblogs.com/hukezhu/p/4505381.html
Copyright © 2011-2022 走看看