iOS 展示二级页面
ViewController 调用
#import "ViewController.h"
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"测试";
self.view.backgroundColor = [UIColor whiteColor];
//自定义调用
NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"1",@"2",@"3",@"4",@"5",@"6",@"1",@"2", nil];
NSMutableArray *textArr = [[NSMutableArray alloc] initWithObjects:@"全部",@"女装",@"箱包",@"配饰",@"内衣",@"男装",@"美妆",@"母婴",@"居家",@"家电",@"食品",@"鞋靴",@"全部",@"女装", nil];
// self.customView = [[CustomView alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, 100) dataArray:arr];
self.customView = [[CustomView alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, 100) dataArray:arr textArray:textArr];
[self.view addSubview:self.customView];
}
//一级页面视图 CustomView
#import <UIKit/UIKit.h>
#import "CustomFenLeiChildView.h"
//自定义头文件
@interface CustomView : UIView
{
//记录相同按钮的Y
float ButtonY;
//记录选中的分类子视图tag
int selectedTag;
CustomFenLeiChildView *lastCustomView;
CustomFenLeiChildView *customView;
//记录button
UIButton *laseButton;
//是否是展开
BOOL isZhanKai;
}
@property (nonatomic, strong)NSMutableArray *dataArr;
-(id)initWithFrame:(CGRect)frame dataArray:(NSMutableArray *)dataArray;
-(id)initWithFrame:(CGRect)frame dataArray:(NSMutableArray *)dataArray textArray:(NSMutableArray *)textArray;
@end
//一级视图实现文件.m
#import "CustomView.h"
//自定义实现文件
@implementation CustomView
-(id)initWithFrame:(CGRect)frame dataArray:(NSMutableArray *)dataArray
{
self = [super initWithFrame:frame];
if (self)
{
//button坐标
float bx = 0;
float by = 0;
float bw = frame.size.width/4;
float bh = bw;
//imageView坐标
float imgX = 10;
float imgW = bw-20;
float imgH = imgW;
float imgY = 10;
for (int i = 0; i < dataArray.count; i++)
{
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
// button.backgroundColor = [UIColor yellowColor];
if (i % 4 == 0 && i > 0)
{
bx = 0;
by += bh;
}
button.frame = CGRectMake(bx, by, bw, bh);
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(imgX, imgY, imgW, imgH)];
// imgView.backgroundColor = [UIColor redColor];
imgView.image = [UIImage imageNamed:@"1.png"];
[button addSubview:imgView];
[self addSubview:button];
bx += bw;
}
}
return self;
}
-(id)initWithFrame:(CGRect)frame dataArray:(NSMutableArray *)dataArray textArray:(NSMutableArray *)textArray
{
self = [super initWithFrame:frame];
if (self)
{
self.dataArr = [[NSMutableArray alloc] init];
self.dataArr = textArray;
//button坐标
float bx = 0;
float by = 0;
float bw = frame.size.width/4;
float bh = bw;
//imageView坐标
float imgX = 15;
float imgW = bw-30;
float imgH = imgW;
float imgY = 15;
float selfHeight = 0.0;
for (int i = 0; i < dataArray.count; i++)
{
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.tag = i+100;
if (i % 4 == 0 && i > 0)
{
bx = 0;
by += bh;
ButtonY = by;
}
button.frame = CGRectMake(bx, by, bw, bh);
[button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:button];
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(imgX, imgY, imgW, imgH)];
imgView.layer.cornerRadius = imgW/2;
imgView.layer.masksToBounds = YES;
imgView.image = [UIImage imageNamed:@"1.png"];
[button addSubview:imgView];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(imgX, imgY+imgH+3, imgW, 20)];
label.text = [textArray objectAtIndex:i];
label.font = [UIFont systemFontOfSize:14.0];
label.textColor = [UIColor colorWithRed:65/255.0 green:65/255.0 blue:65/255.0 alpha:1];
label.textAlignment = NSTextAlignmentCenter;
[button addSubview:label];
bx += bw;
selfHeight = by+bh;
}
CGRect selfFrame = self.frame;
selfFrame.size.height = selfHeight;
self.frame = selfFrame;
}
return self;
}
-(void)buttonClick:(UIButton *)btn
{
BOOL bl = NO;
int index = (int)btn.tag - 100;
if (laseButton)
{
ButtonY = laseButton.frame.origin.y;
}
if(btn && btn.tag == laseButton.tag)
{
bl = YES;
}
if (lastCustomView)
{
[lastCustomView removeFromSuperview];
lastCustomView = nil;
}
CGRect btnFrame = btn.frame;
if (!bl)
{
laseButton = btn;
isZhanKai = YES;
UILabel *label = [btn.subviews lastObject];
NSLog(@"%@",label.text);
float childViewY = btnFrame.origin.y+btnFrame.size.height + 10;
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"上衣",@"裤装",@"裙装",@"套装",@"大码", nil];
CustomFenLeiChildView *currntView = [[CustomFenLeiChildView alloc] initWithFrame:CGRectMake(0, childViewY, self.frame.size.width, 120) fenLeiArray:array];
[self addSubview:currntView];
selectedTag = index+1000;
currntView.tag = selectedTag;
lastCustomView = currntView;
customView = currntView;
[self updateUI:btnFrame childViewFrame:currntView.frame index:index];
}
else
{
isZhanKai = NO;
laseButton = nil;
UILabel *label = [btn.subviews lastObject];
NSLog(@"%@",label.text);
customView = (CustomFenLeiChildView *)[self viewWithTag:selectedTag];
CGRect customRect = customView.frame;
customRect.size.height = 0;
[customView removeFromSuperview];
[self updateUI:btnFrame childViewFrame:customRect index:index];
}
}
-(void)updateUI:(CGRect)btnFrame childViewFrame:(CGRect)childViewFrame index:(int)index
{
//去掉原来的展开视图
//重新排列button
//获取当前点击buton的y
//设置展开视图
//后面的修改view
//判断:1.当前展开视图是否展开(如果是展开,获取到当前点击的button,计算展开在哪,如果不需要展开,获取到当前点击的button,计算之后的button的坐标)
//--------------重新排列
//button坐标
float bx = 0;
float by = 0;
float bw = self.frame.size.width/4;
float bh = bw;
float selfHeight = 0.0;
for (int i = 0; i < self.dataArr.count; i++)
{
UIButton *button = (UIButton *)[self viewWithTag:i+100];
CGRect buttonFrame = button.frame;
if (i % 4 == 0 && i > 0)
{
bx = 0;
by += bh;
}
buttonFrame = CGRectMake(bx, by, bw, bh);
button.frame = buttonFrame;
bx += bw;
selfHeight = by+bh;
}
if (isZhanKai)
{
bx = 0;
if (btnFrame.origin.y > ButtonY)
{
UIButton *button = (UIButton *)[self viewWithTag:index+100];
customView = (CustomFenLeiChildView *)[self viewWithTag:index+1000];
CGRect customRect = customView.frame;
customRect.origin.y = button.frame.origin.y+button.frame.size.height+10;
customView.frame = customRect;
by = customView.frame.origin.y+customView.frame.size.height;
}
else
{
by = childViewFrame.origin.y+childViewFrame.size.height;
}
//获取当前的索引
int a = index % 4;
int c = 4 - a;
//获取要开始计算的button的索引
int b = index + c;
if (b > self.dataArr.count)
{
b = self.dataArr.count;
}
for (int i = b; i < self.dataArr.count; i++)
{
UIButton *button = (UIButton *)[self viewWithTag:i+100];
CGRect buttonFrame = button.frame;
if (i % 4 == 0 && i > b)
{
bx = 0;
by += bh;
}
buttonFrame = CGRectMake(bx, by, bw, bh);
button.frame = buttonFrame;
bx += bw;
selfHeight = by+bh;
}
}
else
{
NSLog(@"不是展开");
}
CGRect selfFrame = self.frame;
selfFrame.size.height = selfHeight;
self.frame = selfFrame;
}
//展开详情(二级页面视图) CustomFenLeiChildView
#import <UIKit/UIKit.h>
#import "LabelOfButton.h"
@interface CustomFenLeiChildView : UIView
-(id)initWithFrame:(CGRect)frame fenLeiArray:(NSMutableArray *)fenLeiArray;
@end
//展开详情实现文件
#import "CustomFenLeiChildView.h"
#define lineBgColor [UIColor colorWithRed:189/255.0 green:189/255.0 blue:189/255.0 alpha:1]
@implementation CustomFenLeiChildView
-(id)initWithFrame:(CGRect)frame fenLeiArray:(NSMutableArray *)fenLeiArray
{
self = [super initWithFrame:frame];
if (self)
{
UIView *topLine = [[UIView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, 1)];
topLine.backgroundColor = lineBgColor;
[self addSubview:topLine];
//button坐标
float bx = 0;
float by = 0;
float bw = (frame.size.width-1)/2;
float hang = fenLeiArray.count/2;
float bh = frame.size.height/hang-1*(hang-1);
float selfHeight = 0.0;
for (int i = 0; i < fenLeiArray.count; i++)
{
if (i % 2 == 0 && i > 0)
{
bx = 0;
by += bh;
}
LabelOfButton *button = [[LabelOfButton alloc] initWithFrame:CGRectMake(bx, by, bw, bh)];
button.tag = i+100;
button.textLB.text = fenLeiArray[i];
button.textLB.textAlignment = NSTextAlignmentCenter;
[button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:button];
UIView *bottomLine = [[UIView alloc] initWithFrame:CGRectMake(bx, by+bh, bw, 1)];
bottomLine.backgroundColor = lineBgColor;
[self addSubview:bottomLine];
UIView *shuLine = [[UIView alloc] initWithFrame:CGRectMake(bx+bw, by, 1, bh)];
shuLine.backgroundColor = lineBgColor;
[self addSubview:shuLine];
bx += bw;
selfHeight = by+bh;
}
if (fenLeiArray.count % 2 == 1)
{
LabelOfButton *button = [[LabelOfButton alloc] initWithFrame:CGRectMake(bx, by, bw, bh)];
button.textLB.text = @"最后一个";
button.tag = fenLeiArray.count+100;
// button.textLabel.text = fenLeiArray[i];
button.textLB.textAlignment = NSTextAlignmentCenter;
[button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:button];
UIView *bottomLine = [[UIView alloc] initWithFrame:CGRectMake(bx, by+bh, bw, 1)];
bottomLine.backgroundColor = lineBgColor;
[self addSubview:bottomLine];
}
CGRect selfFrame = self.frame;
selfFrame.size.height = selfHeight;
self.frame = selfFrame;
}
return self;
}
-(void)buttonClick:(LabelOfButton *)btn
{
NSLog(@"%@",btn.textLB.text);
}
//自定义button ,添加label
#import <UIKit/UIKit.h>
//#import "NewCustomLabel.h"
@interface LabelOfButton : UIButton
@property (nonatomic, strong) UILabel *textLB;
@end
#import "LabelOfButton.h"
#define GrayColor [UIColor colorWithRed:165.0/255.0 green:165.0/255.0 blue:165.0/255.0 alpha:1.0]
@implementation LabelOfButton
-(id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.textLB = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
[self.textLB setFont:[UIFont systemFontOfSize:16]];
self.textLB.textColor = GrayColor;
self.textLB.textAlignment = NSTextAlignmentLeft;
[self addSubview:self.textLB];
}
return self;
}
@end
实现效果如下图所示

iOS 展示二级页面的更多相关文章
- vue爬坑之路1-路由跳转全新页面以及二级页面配置
之前也在网找了一些答案,比较零碎,特此总结下,废话不多说,直接上干货! 路由跳转全新页面 首先在app.vue中先定义router-view,这是主路由. 在router的index.js中引入log ...
- IOS的H5页面滑动不流畅的问题:
IOS的H5页面滑动不流畅的问题: -webkit-overflow-scrolling : touch; 需要滑动的是哪块区域,就在哪里加上这段代码就OK
- Html5 Egret游戏开发 成语大挑战(八)一般性二级页面处理
在游戏中,我们一般会有各种各样的二级页面,比如游戏暂停界面或者游戏结束界面,这些界面组成了对玩家交互主要手段,在游戏开发中,对于这些界面的coding组织是非常有学问的,如果倒退到十年前,游戏开发的老 ...
- 关于html5与jsp页面同样的html代码展示的页面效果不一样的问题
原文:关于html5与jsp页面同样的html代码展示的页面效果不一样的问题 html5默认的声明为 <!DOCTYPE html> jsp默认的声明头部为 <%@ page con ...
- 用github展示前端页面
今天尝试了一下使用github展示前端页面,还是比较简单的,平时做一些小的demo时,可以用这个方法展示自己的页面,在此记录下方法. 首先打开自己的github项目仓库,比如 https://gi ...
- web scraper 抓取分页数据和二级页面内容
如果是刚接触 web scraper 的,可以看第一篇文章. web scraper 是一款免费的,适用于普通用户(不需要专业 IT 技术的)的爬虫工具,可以方便的通过鼠标和简单配置获取你所想要数据. ...
- ios访问web页面<div>点击事件不起效果,以及alert()显示url的解决办法
ios访问web页面<div>点击不起效果,在其div上添加style=”cursor:pointer:“ jquery web页面动态append()事件调用方法:$(document) ...
- Android ios嵌套web页面
我们现在做一个活动页面,Android和ios的活动页面用web来做,方便更改,下面有几个小问题: 1.在Android和ios中,虽然web上面可以存localstorage,但是到了Android ...
- ios嵌套H5页面,出现的小bug;
ios嵌套H5页面,点击数字时就会弹出打电话的功能:解决方法: 在head标签中添加: <meta name="format-detection" content=" ...
随机推荐
- noi 8787 数的划分
题目链接:http://noi.openjudge.cn/ch0206/8787/ 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序). 简直跟分苹果一模一样. #include < ...
- 【译】微型ORM:PetaPoco【不完整的翻译】
PetaPoco是一款适用于.Net 和Mono的微小.快速.单文件的微型ORM. PetaPoco有以下特色: 微小,没有依赖项……单个的C#文件可以方便的添加到任何项目中. 工作于严格的没有装饰的 ...
- Designing a CSS based template
http://veerle-v2.duoh.com/blog/comments/designing_a_css_based_template_part_i/
- oracle mysql sqlserver数据库中的分页
oracle: select * from (select rownum r,t1.* from tablename t1 where rownum <M+N ) t2 where t2.r&g ...
- 使用nodewebx进行前后端开发环境分离
下载nodewebx(windows环境) npm install nodewebx npm install inherits 为什么要下载inherits,因为nodewebx依赖它... 构建目录 ...
- mac 安装 nginx 环境
1.brew search nginx 2.brew install nginx 启动nginx ,sudo nginx ;访问localhost:8080 发现已出现nginx的欢迎页面了. 备注: ...
- 深入浅出设计模式——代理模式(Proxy Pattern)
模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用.代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 ...
- Js获取下拉框选定项的值和文本
Js获取下拉框的值和文本网上提供了2种方法:但有些人很不负责任,他们根本没考虑到浏览器之间的差异导致的错误,导致很多新手琢磨了半天找不出错误! 下面我总结下Firefox和IE下获取下拉框选定项的值和 ...
- SQL语言增加、修改、删除数据的语法
增加 insert into 表名(字段1,字段2) values ('字段1的值','字段2的值'); 修改 update 表名 set 字段1='赋予字段1的新值',字段2='赋予字段2的新值' ...
- CAD迷你看图
CAD迷你看图http://www.aec188.com/CAD迷你看图 2016R12超快.超小的CAD多功能看图工具,完全脱离AutoCAD浏览R14-R2016各版本DWG/DXF/DWF的二三 ...