纯代码方式实现九宫格布局

功能分析:

  1> 以九宫格的形式展示应用信息

  2> 点击下载按钮后, 做出相应的操作

分析:

  1> 找出九宫格布局的规律, 设置每个控件的x和y

    - y值: 用行号决定; 取整运算(控件索引/九宫格布局的列数)

    - x值: 用列号决定; 取模运算(控件索引%九宫格布局的列数)

  2> 每个控件中包含若干子控件, 考虑用view进行包装, 便于计算

  3> 抽取九宫格布局中的重要数据, 便于布局的修改

代码实现:

  1 #import "ViewController.h"
  2
  3 @interface ViewController ()
  4
  5 /** 用于存放app信息 */
  6 @property(nonatomic, strong)NSArray *apps;
  7
  8 @end
  9
 10 @implementation ViewController
 11
 12 // 懒加载
 13 - (NSArray *)apps
 14 {
 15     if (!_apps) {
 16         // 从plist文件中获取数据
 17         NSString *path = [[NSBundle mainBundle] pathForResource:@"app.plist" ofType:nil];
 18         _apps = [NSArray arrayWithContentsOfFile:path];
 19     }
 20     return _apps;
 21 }
 22
 23 - (void)viewDidLoad {
 24     [super viewDidLoad];
 25
 26
 27     // 1. 布局九宫格的列数
 28     NSInteger colsNum = 3;
 29
 30     // 2. 每个app的大小
 31     CGFloat appW = 80;
 32     CGFloat appH = 90;
 33
 34     // 3. 设置每列之间的间距 = (控制器view的宽度 - 列数 * app的宽度) / 间隙数
 35     CGFloat colsMargin = (self.view.frame.size.width - colsNum * appW) / (colsNum + 1);
 36     // 设置每行之间的间距
 37     CGFloat rowsMargin = 30;
 38
 39     // 4. 根据应用个数创建
 40     for (int index = 0; index < self.apps.count; index++) {
 41         // 4.1 创建app
 42         UIView *appView = [[UIView alloc] init];
 43
 44         // 4.2 计算app的位置
 45         // 4.2.1 计算行号和列号
 46         int row = index / colsNum;
 47         int col = index % colsNum;
 48
 49         // 4.2.2 计算x和y(注意: 不要被手机顶部状态栏的高度(20)挡住)
 50         CGFloat appX = colsMargin + col * (appW + colsMargin);
 51         CGFloat appY = rowsMargin + row * (appH + rowsMargin);
 52
 53         // 4.2.3 设置app的frame
 54         appView.frame = CGRectMake(appX, appY, appW, appH);
 55
 56         // 4.3 添加到控制器的view
 57         [self.view addSubview:appView];
 58
 59         // 4.4 设置app内部控件
 60         // 4.4.1 index位置对应的应用信息
 61         NSDictionary *appInfo = self.apps[index];
 62
 63         // 4.4.2 添加图标
 64         UIImageView *iconView = [[UIImageView alloc] init];
 65
 66         // 4.4.3 设置图标位置
 67         CGFloat iconW = 45;
 68         CGFloat iconH = 45;
 69         CGFloat iconX = (appW - iconW) * 0.5;
 70         CGFloat iconY = 0;
 71         iconView.frame = CGRectMake(iconX, iconY, iconW, iconH);
 72
 73         // 4.4.4 设置图片
 74         iconView.image = [UIImage imageNamed:appInfo[@"icon"]];
 75         [appView addSubview:iconView];
 76
 77         // 4.4.5 添加文字
 78         UILabel *nameLabel = [[UILabel alloc] init];
 79
 80         // 4.4.6 设置文字位置
 81         CGFloat nameW = appW;
 82         CGFloat nameH = 20;
 83         CGFloat nameX = 0;
 84         CGFloat nameY = iconY + iconH;
 85         nameLabel.frame = CGRectMake(nameX, nameY, nameW, nameH);
 86
 87         // 4.4.7 设置文字
 88         nameLabel.text = appInfo[@"name"];
 89         nameLabel.font = [UIFont systemFontOfSize:13];
 90         nameLabel.textAlignment = NSTextAlignmentCenter;
 91         [appView addSubview:nameLabel];
 92
 93         // 4.4.8 添加按钮
 94         UIButton *downloadBtn = [[UIButton alloc] init];
 95
 96         // 4.4.9 设置按钮位置
 97         CGFloat downloadX = 12;
 98         CGFloat downloadY = nameY + nameH;
 99         CGFloat downloadW = appW - 2 * downloadX;
100         CGFloat downloadH = 20;
101         downloadBtn.frame = CGRectMake(downloadX, downloadY, downloadW, downloadH);
102
103         // 4.4.10 设置按钮
104         [downloadBtn setBackgroundImage:[UIImage imageNamed:@"buttongreen"] forState:UIControlStateNormal];
105         [downloadBtn setBackgroundImage:[UIImage imageNamed:@"buttongreen_highlighted"] forState:UIControlStateHighlighted];
106         [downloadBtn setTitle:@"下载" forState:UIControlStateNormal];
107         downloadBtn.titleLabel.font = [UIFont systemFontOfSize:13];
108         [downloadBtn addTarget:self action:@selector(downloadClick) forControlEvents:UIControlEventTouchUpInside];
109         [appView addSubview:downloadBtn];
110     }
111
112 }
113
114 - (void)downloadClick
115 {
116     NSLog(@"%s", __func__);
117 }
118 @end
时间: 2024-10-23 13:27:53

纯代码方式实现九宫格布局的相关文章

iOS界面布局之三——纯代码的autoLayout及布局动画

iOS界面布局之三--纯代码的autoLayout及布局动画 一.引言 关于界面布局,apple的策略已经趋于成熟,autolayout的优势在开发中也已经展现的淋漓尽致.除了使用storyBoard进行布局约束的拖拽,有时我们也需要在代码中进行autolayout的布局设置,Masonry库可以方便的创建约束属性,实际上,我们也没有必要再使用系统原生的代码来创建和设置约束,这篇博客只作为使用的方法备忘.前几篇布局介绍的链接如下: 使用autoresizing进行界面布局:http://my.o

【iOS开发】多屏尺的自动适配 AutoLayout (纯代码方式)

关于AutoLayout,最早从iOS6开始引入使用. 主要功能是使用约束,对视图进行相对布局,以适应不同屏尺的变换. 网上大量的资料都在介绍xib和storyboard,如何使用AutoLayout,说纯代码使用AutoLayout进行UI布局的越来越少.对于我这个习惯了代码UI布局的人,写个备忘: AutoLayout是什么? 使用一句Apple的官方定义的话 AutoLayout是一种基于约束的,描述性的布局系统. Auto Layout Is a Constraint-Based, De

代码写个九宫格布局显示图片

不在xml中设置布局,在代码中直接写个布局,显示下载的图片,如下图所示,图片有点丑 XML中添加个linearLayout <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" an

通过纯代码方式发布WCF服务

网络上搜索WCF服务,一般是寄宿在IIS,通过WebConfig方式配服务地址,接口类型等信息,但是对于我这样的懒人,目前项目在开发阶段,实在不愿意每次添加新服务就更新配置文件,于是使用了反射来加载服务接口,并用控制台程序发布服务,贴上代码如下. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.

通过 Masonry使用纯代码方式编写 Auto Layout--配置 Masonry

Auto Layout 很 awesome 对不对,但是apple 默认的用代码写 Auto Layout 的方式实在是太鸡肋了-噩梦一样! 但是作为一个手(也)码(爱)爱(装)好(X)者,用 StoryBoard 显然不是咱的菜! 对了,忘了说一句, SizeClass 很酷,并且是用 IB 来弄的,但是先不用担心,我们至少要适配 iOS7,也就是说, Size Class 到很流行还有一段时间,到时候肯定有大神(或者是你)找出 Size Class 的代码解决方案的 ! 言归正传,我们回到代

代码方式实现线性布局和相对布局居中属性

mTVText.setGravity(Gravity.CENTER); //左上角设置为:Gravity.LEFT|Gravity.TOP          //LinearLayout居中 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.gravity = Gravity.CENTER_HO

c# 纯代码方式创建快捷方式

using System; using System.Collections.Generic; using System.Text; using Microsoft.Win32; using System.Runtime.InteropServices; namespace ShortcutNamespace { class MyShortcut { [StructLayout(LayoutKind.Sequential)] public struct FILETIME { uint dwLow

纯代码添加约束,autolayout 适配

IOS AutoLayout 代码约束—VFL 2014-12-22 22:19:43http://my.oschina.net/carson6931-Carson6931-点击数:2148 IOS 提供了两种添加约束的方法 第一种: +(instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2

ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

本文转自 :http://www.cnblogs.com/wendingding/p/3761730.html ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局 一.实现效果 二.使用纯代码自定义一个tableview的步骤 1.新建一个继承自UITableViewCell的类 2.重写initWithStyle:reuseIdentifier:方法 添加所有需要显示的子控件(不需要设置子控件的数据和frame,  子控件要添加到contentView中