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

实现效果如下图所示

              

原文地址:https://www.cnblogs.com/camillezlh/p/4619297.html