首页 > 代码库 > [iOS基础控件 - 4.1] APP列表
[iOS基础控件 - 4.1] APP列表
需求
1.以N宫格的形式展示应用信息
2.APP信息包括图标、名字、下载按钮
3.使用尽可能少的代码,从plist读取app信息,计算每个app图标的位置尺寸信息
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 =http://www.mamicode.com/ 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] 访问吗?
[iOS基础控件 - 4.1] APP列表
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。