• [iOS基础控件


    需求
    1.以N宫格的形式展示应用信息
    2.APP信息包括图标、名字、下载按钮
    3.使用尽可能少的代码,从plist读取app信息,计算每个app图标的位置尺寸信息
     
    Image
     
    A.思路
    1.UI布局:N宫格
    2.事件监听
    3.动态添加 (by plist)
    4.整体封装,组合每个应用信息,使用View的层级包装帮助布局
     
    B.实现 (使用纯代码方式)
     
      1 //
      2 //  ViewController.m
      3 //  01-应用管理
      4 //
      5 //  Created by hellovoidworld on 14/11/24.
      6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
      7 //
      8 
      9 #import "ViewController.h"
     10 
     11 #define APP_WIDTH 85
     12 #define APP_HEIGHT 90
     13 #define MARGIN_HEAD 20
     14 #define ICON_WIDTH 50
     15 #define ICON_HEIGHT 50
     16 #define NAME_WIDTH APP_WIDTH
     17 #define NAME_HEIGHT 20
     18 #define DOWNLOAD_WIDTH (APP_WIDTH - 20)
     19 #define DOWNLOAD_HEIGHT 20
     20 
     21 @interface ViewController ()
     22 
     23 /** 存放应用信息 */
     24 @property(nonatomic, strong) NSArray *apps; // 应用列表
     25 
     26 @end
     27 
     28 @implementation ViewController
     29 
     30 - (void)viewDidLoad {
     31     [super viewDidLoad];
     32     // Do any additional setup after loading the view, typically from a nib.
     33    
     34     [self loadApps];
     35 }
     36 
     37 - (void)didReceiveMemoryWarning {
     38     [super didReceiveMemoryWarning];
     39     // Dispose of any resources that can be recreated.
     40 }
     41 
     42 #pragma mark 取得应用列表
     43 - (NSArray *) apps {
     44     if (nil == _apps) {
     45         NSString *path = [[NSBundle mainBundle] pathForResource:@"app.plist" ofType:nil];
     46         _apps = [NSArray arrayWithContentsOfFile:path];
     47     }
     48 
     49     return _apps;
     50 }
     51 
     52 #pragma mark 加载全部应用列表
     53 - (void) loadApps {
     54     int appColumnCount = [self appColumnCount];
     55     int appRowCount = [self appRowCount];
     56    
     57     CGFloat marginX = (self.view.frame.size.width - APP_WIDTH * appColumnCount) / (appColumnCount + 1);
     58     CGFloat marginY = (self.view.frame.size.height - APP_HEIGHT * appRowCount) / (appRowCount + 1) + MARGIN_HEAD;
     59    
     60     int column = 0;
     61     int row = 0;
     62     for (int index=0; index<self.apps.count; index++) {
     63         NSDictionary *appData = self.apps[index];
     64        
     65         // 每个app信息
     66         UIView *appView = [[UIView alloc] init];
     67        
     68         CGFloat appX = marginX + column * (marginX + APP_WIDTH);
     69         CGFloat appY = marginY + row * (marginY + APP_HEIGHT);
     70        
     71         appView.frame = CGRectMake(appX, appY, APP_WIDTH, APP_HEIGHT);
     72        
     73         // 1.设置APP图片
     74         UIImageView *iconView = [[UIImageView alloc] init];
     75        
     76         CGFloat iconMarginX = (appView.frame.size.width - ICON_WIDTH) / 2;
     77         CGFloat iconMarginY = 0;
     78         iconView.frame = CGRectMake(iconMarginX, iconMarginY, ICON_WIDTH, ICON_HEIGHT);
     79        
     80         iconView.image = [UIImage imageNamed:appData[@"icon"]];
     81         [appView addSubview:iconView];
     82        
     83         // 2.设置APP名字
     84         UILabel  *nameLabel = [[UILabel alloc] init];
     85         nameLabel.text = appData[@"name"];
     86         CGFloat nameMarginX = (appView.frame.size.width - NAME_WIDTH) / 2;
     87         CGFloat nameMarginY = iconMarginY + ICON_HEIGHT;
     88         nameLabel.frame = CGRectMake(nameMarginX, nameMarginY, NAME_WIDTH, NAME_HEIGHT);
     89         [nameLabel setFont:[UIFont systemFontOfSize:16]];
     90         [nameLabel setTextAlignment:NSTextAlignmentCenter];
     91         [appView addSubview:nameLabel];
     92        
     93         // 3.设置下载按钮
     94         UIButton *downloadButton = [UIButton buttonWithType:UIButtonTypeCustom];
     95         CGFloat downloadMarginX = (appView.frame.size.width - DOWNLOAD_WIDTH) / 2;
     96         CGFloat downloadMarginY = nameMarginY + NAME_HEIGHT;
     97         downloadButton.frame = CGRectMake(downloadMarginX, downloadMarginY, DOWNLOAD_WIDTH, DOWNLOAD_HEIGHT);
     98        
     99         UIImage *downloadNormalImage = [UIImage imageNamed:@"buttongreen"];
    100         [downloadButton setBackgroundImage:downloadNormalImage forState:UIControlStateNormal];
    101        
    102         UIImage *downloadHighlightedImage = [UIImage imageNamed:@"buttongreen_highlighted"];
    103         [downloadButton setBackgroundImage:downloadHighlightedImage forState:UIControlStateHighlighted];
    104        
    105         [downloadButton setTitle:@"下载" forState:UIControlStateNormal];
    106        
    107         // 不要直接取出titleLabel属性进行操作,因为这样就不能为全部状态进行设置
    108         [downloadButton.titleLabel setFont:[UIFont systemFontOfSize:13]];
    109        
    110         [appView addSubview:downloadButton];
    111        
    112        
    113         [self.view addSubview:appView];
    114        
    115         column++;
    116         if (column == appColumnCount) {
    117             column = 0;
    118             row++;
    119         }
    120     }
    121 }
    122 
    123 #pragma mark 计算列数
    124 - (int) appColumnCount {
    125     int count = 0;
    126     count = self.view.frame.size.width / APP_WIDTH;
    127    
    128     if ((int)self.view.frame.size.width % (int)APP_WIDTH == 0) {
    129         count--;
    130     }
    131    
    132     return count;
    133 }
    134 
    135 #pragma mark 计算行数
    136 - (int) appRowCount {
    137     int count = 0;
    138     count = (self.view.frame.size.height - MARGIN_HEAD) / APP_HEIGHT;
    139    
    140     if ((int)(self.view.frame.size.height - MARGIN_HEAD) % (int)APP_HEIGHT == 0) {
    141         count--;
    142     }
    143    
    144     return count;
    145 }
    146 @end
    #1. 放入了Images.xcassets中的文件只能通过[UIImage imageNamed:(NSString *) imageName] 访问吗?
  • 相关阅读:
    python数据结构之图的实现方法
    大数据将如何颠覆信任危机
    大数据将如何颠覆信任危机
    JQuery的入门(二)
    递归思想
    Jquery的入门(一)
    如果让你写一个消息队列,该如何进行架构设计啊?
    如何解决消息队列的延时以及过期失效问题?消息队列满了以后怎么处理?有几百万消息持续积压 几小时.怎么解决?
    如何保证消息的顺序性?
    如何保证消息在传送的过程中不会丢失?(如何保证消息的可靠性传输?)
  • 原文地址:https://www.cnblogs.com/hellovoidworld/p/4119744.html
Copyright © 2020-2023  润新知