关于九宫格的布局以及坐标的计算,对于大多数的iOS初学者甚至有一定能力的学者来说都是一大难题,在此写者通过自己的开发经验以及多次应用,把自己的所学所得分享给大家,就通过应用管理来进行浅谈一二。

    1、 功能分析:通过九宫格的样式添加相应的应用;当点击“下载”按钮时会执行相应的操作

2、实现步骤:1>.首先加载相应的应用信息;2>.根据应用的个数添加相对应的view;3>.实现按钮的点击事件,完成相应的后续操作

分析:格局布局的规律,每一个UIView的x坐标 和 y坐标与布局的行列有关

  每一行的 y 值都相同,y 由行号决定

每一列的 x 值都相同,x 值由列号决定

3、实现的思路:

1>.首先要明确每一个模块是用的是什么view;

2>.明确每个view之间的父子关系,一个父view可以有多个子view,而每个试图则只有一个父视图

3>在添加格子的时候,首先可以先添加一个格子,然后在尝试着使用 for 循环进行循环添加

4>.在加载app数据的时候,首先要明确加载数据的长度,而后根据加载数据的长度来决定创建多少个格子

5>.逐步添加格子内部的各个子控件

6>.给各自内部的子控件加载相应的数据,即,给子控件赋值

7>.实例化 UIScrollView 的对象,并设置相应的属性,而后把scrollView添加到控制器的view上,最后把布局好的九宫格添加到scrollView上

3、xib视图分析:

通过多种方法的测试发现,使用xib会使九宫格布变得更为简单易懂,因此,xib布局如下图所示

 分析:在一个xib 视图中共包含三个子控件:imageView、label 和button

4、代码展示:

1>.首先创建模型,声明plist文件中的数据信息

Model:

 //  GWFAppListModel.h
// 应用管理(xib 版)
#import <Foundation/Foundation.h> @interface GWFAppListModel : NSObject @property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *icon; +(instancetype)getGWFAppListModelWithDict:(NSDictionary *)dict; @end
 //  GWFAppListModel.m
// 应用管理(xib 版) #import "GWFAppListModel.h" @implementation GWFAppListModel +(instancetype)getGWFAppListModelWithDict:(NSDictionary *)dict {
GWFAppListModel *appModel = [[GWFAppListModel alloc] init]; [appModel setValuesForKeysWithDictionary:dict]; return appModel;
} @end

View:

 //  GWFAppListView.h
// 应用管理(xib 版) #import <UIKit/UIKit.h>
@class GWFAppListModel; @interface GWFAppListView : UIView @property (nonatomic,strong) GWFAppListModel *appModel; @end
 //  GWFAppListView.m
// 应用管理(xib 版) #import "GWFAppListView.h"
#import "GWFAppListModel.h" @interface GWFAppListView ()
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (weak, nonatomic) IBOutlet UIButton *downloadBtn; @end @implementation GWFAppListView //下载按钮的点击事件
- (IBAction)downLoadBtnClick:(id)sender { //获取 appView 的superView
UIView *superView = self.superview; //计算 superView 的尺寸
CGSize superViewSize = superView.frame.size; //添加蒙版
UIView *coverView = [[UIView alloc] initWithFrame:superView.bounds]; //设置coverView 的颜色
coverView.backgroundColor = [UIColor blackColor]; //设置 coverView 的透明度
coverView.alpha = ; //把 coverView 添加到 superView 上
[superView addSubview:coverView]; //添加一个 label
CGFloat labelY = superViewSize.height / ; //实例化 label
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(, labelY, superViewSize.width, )]; //设置 label 的文本
label.text = @"正在下载,请稍后...";
//设置文本对齐方式
label.textAlignment = NSTextAlignmentCenter; //设置文本字体颜色
label.textColor = [UIColor whiteColor]; //设置文本字体大小
label.font = [UIFont boldSystemFontOfSize:]; //添加到 coverView 上
[coverView addSubview:label]; // completion 完成之后, 会调用block中的代码
[UIView animateWithDuration: animations:^{
//设置蒙版的透明度
coverView.alpha = 0.6; } completion:^(BOOL finished) {
[UIView animateWithDuration: delay: options:UIViewAnimationOptionCurveEaseInOut animations:^{ coverView.alpha = ; } completion:^(BOOL finished) { //销毁 coverView
[coverView removeFromSuperview]; //关闭按钮的交互,并显示 已安装
UIButton *button = sender; button.enabled = NO; [button setTitle:@"已安装" forState:UIControlStateNormal]; //设置按钮的 title 的颜色
[button setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled]; }]; }];
} -(void)setAppModel:(GWFAppListModel *)appModel {
_appModel = appModel; //给子控件赋值
self.iconView.image = [UIImage imageNamed:appModel.icon];
self.nameLabel.text = appModel.name;
} @end

Controller:

 //  ViewController.m
// 应用管理(xib 版)
#import "ViewController.h"
#import "GWFAppListModel.h"
#import "GWFAppListView.h" @interface ViewController () @property (nonatomic,strong) NSArray *dataArray; @property (nonatomic,strong) UIScrollView *scrollView; @end @implementation ViewController //懒加载
-(NSArray *)dataArray {
if (_dataArray == nil) {
//读取 plist 文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"app.plist" ofType:nil];
//创建一个数组接收文件内容
NSArray *dictArr = [NSArray arrayWithContentsOfFile:path]; //创建一个可变数组
NSMutableArray *tempArr = [NSMutableArray arrayWithCapacity:dictArr.count]; //遍历数组 dictArr
[dictArr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSDictionary *dict = obj; //字典转模型
GWFAppListModel *appModel = [GWFAppListModel getGWFAppListModelWithDict:dict]; //将数据模型 添加到可变数组
[tempArr addObject:appModel];
}];
//赋值
_dataArray = tempArr;
}
return _dataArray;
} - (void)viewDidLoad {
[super viewDidLoad]; self.view.backgroundColor = [UIColor lightGrayColor]; _scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds]; //背景颜色
[_scrollView setBackgroundColor:[UIColor grayColor]]; //添加到 view上
[self.view addSubview:_scrollView]; //更新 UI 界面
[self setUpdateUI];
} //九宫格 布局 UI 界面
-(void)setUpdateUI {
//定义显示的列数
int column = ; //定义 appView 的宽高
CGFloat appViewWidth = ;
CGFloat appViewHeight = ; //计算 appView 之间的间距
CGFloat margin = (self.view.frame.size.width - column * appViewWidth) / (column + ); //计算显示的 appView 的总数
NSInteger count = self.dataArray.count; for (int i = ; i < count; i++) {
//计算 行索引 和 列索引
int colnumIndex = i % column;
int rowIndex = i / column; //计算appView 的x y
CGFloat appViewX = (colnumIndex + ) * margin + colnumIndex * appViewWidth;
CGFloat appViewY = (rowIndex + ) *margin + rowIndex * appViewHeight; //通过 xib 安装目录添加 appView
GWFAppListView *appView = [[[NSBundle mainBundle] loadNibNamed:@"GWFAppListView" owner:nil options:nil] lastObject];
//设置 appView 的frame
appView.frame = CGRectMake(appViewX, appViewY, appViewWidth, appViewHeight); //设置背景颜色
[appView setBackgroundColor:[UIColor yellowColor]]; //添加到 _scrollView 上
[_scrollView addSubview:appView]; //取出模型中的数据,并进行赋值
GWFAppListModel *appModel = self.dataArray[i]; appView.appModel = appModel;
} //获取 scrollView DE 最后一个子 view
UIView *view = _scrollView.subviews.lastObject; //设置 scrollView 的contentSize
_scrollView.contentSize = CGSizeMake(, CGRectGetMaxY(view.frame));
}
@end

5、成果展示:随着数据长度的变化,九宫格视图的view个数随着变化,由于添加了 scrollView 应用可以上下滑动

关于iOS应用管理之九宫格的坐标计算以及与UIScrollView的结合的更多相关文章

  1. IOS 应用管理(九宫格) 总结笔记

    1. 开发前的思路 ========================================1> 从mainBundle中加载Plist2> 按照plist中的数据数量先确定各个a ...

  2. iOS开发UI篇—九宫格坐标计算

    iOS开发UI篇—九宫格坐标计算 一.要求 完成下面的布局 二.分析 寻找左边的规律,每一个uiview的x坐标和y坐标. 三.实现思路 (1)明确每一块用得是什么view (2)明确每个view之间 ...

  3. iOS开发 -------- 九宫格坐标计算

    一 要求 完成下面的布局 二 分析 寻找规律,每一个UIView的x坐标和y坐标 三 实现思路 (1) 明确每一块用得是什么View; (2) 明确每个View之间的父子关系,每个视图都只有一个父视图 ...

  4. iOS内存管理

    iOS内存管理的方式是引用计数机制.分为MRC(人式引用计数)和ARC(自动引用计数). 为什么要学习内存管理? 内存管理方式是引用计数机制,通过控制对象的引用计数来实现操作对象的功能.一个对象的生命 ...

  5. 【Bugly干货分享】iOS内存管理:从MRC到ARC实践

    Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...

  6. iOS内存管理个人总结

    一.变量,本质代表一段可以操作的内存,她使用方式无非就是内存符号化+数据类型 1.保存变量有三个区域: 1>静态存储区 2>stack 3>heap 2.变量又根据声明的位置有两种称 ...

  7. IOS内存管理学习笔记

    内存管理作为iOS中非常重要的部分,每一个iOS开发者都应该深入了解iOS内存管理,最近在学习iOS中整理出了一些知识点,先从MRC开始说起. 1.当一个对象在创建之后它的引用计数器为1,当调用这个对 ...

  8. iOS内存管理编程指南

    iOS 内存管理 目录[-] 一:基本原则 二:成员变量的内存管理 三:容器对象与内存管理 四:稀缺资源的管理 五:AutoRelease 六:其他注意事项 iOS下内存管理的基本思想就是引用计数,通 ...

  9. 李洪强iOS开发之 - 实现九宫格并使用SDWebImage下载图片

     李洪强iOS开发之 - 实现九宫格并使用SDWebImage下载图片  源码:  // //  ViewController.m //  08-九宫格扩展 // //  Created by 李洪强 ...

随机推荐

  1. 以k个元素为一组反转单链表

    Example: input: 1->2->3->4->5->6->7->8->NULL and k = 3 output:3->2->1- ...

  2. JQ——选择器

    选择器 实例 选取 * $("*") 所有元素 #id $("#lastname") id="lastname" 的元素 .class $( ...

  3. 转:如何创建.htaccess文件

    方法1.开始-运行-键入cmd,打开cmd窗口 此时的cmd窗口路径是C:\Documents and Settings\username> 键入以下(不包括括号内信息): copy con . ...

  4. 7月12日至芯FPGA就业班招生

    至芯科技FPGA就业培训班将于2014年7月12日正式开班,届时至芯科技将秉承着一贯的教学传统,为广大师生打造一个专业的技术平台和轻松的学习环境. 在夏宇闻教授的带领下,至芯科技汇聚了一批来自国内外大 ...

  5. Growing Pains for Deep Learning

    Growing Pains for Deep Learning Advances in theory and computer hardware have allowed neural network ...

  6. 【HDOJ】1078 FatMouse and Cheese

    这道题目是典型的DFS+记忆化搜索, DP思想.符合:含重叠子问题,无后效性等特点. #include <cstdio> #include <cstring> #include ...

  7. 【转】(DT系列一)DTS结构及其编译方法----不错

    原文网址:http://www.cnblogs.com/biglucky/p/4057476.html DTS结构及其编译方法 一:主要问题 1,需要了解dtsi与dts的关系 2,dts的结构模型 ...

  8. oracle触发器使用总结

    1.说明 1)触发器是一种特殊的存储过程,触发器一般由事件触发并且不能接受参数,存储器由语句块去调用 2)触发器分类: 1.DML触发器: 创建在表上,由DML事件引发 2.instead of触发器 ...

  9. 谈谈托管代码、IL、CLR、ISAPI?

    什么是托管代码?       托管代码是可以使用20多种支持Microsoft .NET Framework的高级语言编写的代码,这些语言包括:C#, J#, Microsoft Visual Bas ...

  10. windows 编程 —— 子窗口类别化(Window Subclassing)

    对于子窗口控件,有时我们可能会想要获取子窗口的某些消息,比如在一个主窗口下有三个按钮,如果想要实现使用键盘Tab或者Shift-Tab键来使焦点切换于不同按钮之间,这时就可以使用子窗口类别化(Wind ...