• iOS中"查看更多/收起"功能实现


    实现效果如图:

    查看更多功能在很多app种都有应用,在这里简单的实现,介绍实现流程:

    一个tableViewCell中包含一个collectionView,"查看更多"按钮是tableView的footerView

    在控制器中ViewController .m中

    #import "ViewController.h"
    #import "ZSTableViewCell.h"
    
    @interface ViewController ()<UITableViewDelegate,UITableViewDataSource>
    
    @property (nonatomic,strong) UITableView *tableView;
    
    //存放标题的数组
    @property (nonatomic,strong) NSArray *titleArray;
    
    @property (nonatomic,strong) UIButton *changeButton;
    
    @property (nonatomic,assign) BOOL isOpen;
    
    @property (nonatomic,assign) NSInteger showButtonNumber;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.tableView = [[UITableView alloc]initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStylePlain];
        
        [self.view addSubview:self.tableView];
        
        self.tableView.delegate = self;
        self.tableView.dataSource = self;
       
        [self.tableView registerClass:[ZSTableViewCell class] forCellReuseIdentifier:@"TheCell"];
       
        self.title = @"查看更多/收起";
        self.isOpen = NO;
        [self.changeButton setTitle:@"查看更多" forState:UIControlStateNormal];
        self.changeButton.backgroundColor = [UIColor clearColor];
        
        UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init];
        flowLayout.itemSize = CGSizeMake(([UIScreen mainScreen].bounds.size.width - 3)/4, 29);
        _showButtonNumber = 8;
        _titleArray = @[@"东方不败",@"岳不群",@"林平之",@"令狐冲",@"岳灵珊",@"任我行",@"左冷禅",@"蓝凤凰",@"向问天",@"田伯光",@"风清扬",@"任盈盈",@"路人甲",@"路人乙",@"路人丙"];
    }
    #pragma  mark --懒加载
    //查看更多/收起按钮
    - (UIButton *)changeButton{
        if (_changeButton == nil) {
            _changeButton = [UIButton buttonWithType:UIButtonTypeCustom];
            _changeButton.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 30);
            [_changeButton addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
            [_changeButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
            [_changeButton setBackgroundColor:[UIColor whiteColor]];
            _changeButton.layer.cornerRadius = 5;
            _changeButton.layer.masksToBounds = YES;
            _changeButton.layer.borderWidth = 1;
            _changeButton.layer.borderColor = [UIColor greenColor].CGColor;
            
        }
        return _changeButton;
    }
    //button点击事件
    - (void)buttonClick:(UIButton *)sender{
        //如果不是展开状态
        if (self.isOpen == NO) {
            [self.changeButton setTitle:@"收起" forState:UIControlStateNormal];
            self.isOpen = YES;
            _showButtonNumber = _titleArray.count;
            
        }else{
            [self.changeButton setTitle:@"查看更多" forState:UIControlStateNormal];
            self.isOpen = NO;
            _showButtonNumber = 8;
        }
        //刷新 动画效果 第0个section  NSIndexSet索引集合
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:(UITableViewRowAnimationAutomatic)];
        /*
         
         UITableViewRowAnimationFade,  消失
         UITableViewRowAnimationRight,  从右滑行     // slide in from right (or out to right)
         UITableViewRowAnimationLeft,
         UITableViewRowAnimationTop,
         UITableViewRowAnimationBottom,
         UITableViewRowAnimationNone,            // available in iOS 3.0
         UITableViewRowAnimationMiddle,
         UITableViewRowAnimationAutomatic 自动
         */
    
    }
    
    #pragma mark --
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
        return 1;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        return 1;
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
        //根据标识返回不同的高度
        if (self.isOpen == YES) {
            //因为每行有4个item,要多出空余的item
            CGFloat height = (self.titleArray.count / 4 + 1) * 30;
            return height;
        }else{
            return 60;
        }
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
        return 0.5;
    }
    - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
        return 30;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        ZSTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TheCell" forIndexPath:indexPath];
        [cell setupCellWithNum:_showButtonNumber ButtonNameArr:_titleArray];
        
        cell.buttonClick = ^(NSInteger index){
            NSLog(@"点击的按钮标签为%ld",index);
        };
       
        return  cell;
    }
    //footview
    - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
        UIView *firstFootView = [[UIView alloc]initWithFrame:self.changeButton.frame];
        [firstFootView addSubview:self.changeButton];
        firstFootView.backgroundColor = [UIColor orangeColor];
        return firstFootView;
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    
    @end

    在tableViewCell的.h中

    #import <UIKit/UIKit.h>
    
    @interface ZSTableViewCell : UITableViewCell
    //点击cell的回调
    @property (nonatomic,copy) void (^buttonClick)(NSInteger index);
    
    - (void)setupCellWithNum:(NSInteger)buttonCount ButtonNameArr:(NSArray *)buttonArray;
    
    @end

    tableViewCell的.m

    #import "ZSTableViewCell.h"
    #import "TheItemCell.h"
    
    @interface ZSTableViewCell ()<UICollectionViewDataSource,UICollectionViewDelegate>
    
    @property (nonatomic,strong) UICollectionView *collectionView;
    
    @property (nonatomic,assign) NSInteger cellNum;//接受控制器传来的数组个数
    
    @property (nonatomic,strong) NSArray *buttonTitleArray;
    
    @end
    @implementation ZSTableViewCell
    
    
    - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
        
        self = [super initWithStyle: style reuseIdentifier:reuseIdentifier];
        if (self) {
            
            //流水布局
            UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init];
            flowLayout.itemSize = CGSizeMake(([UIScreen mainScreen].bounds.size.width - 3)/4, 29);
            //行间距
            flowLayout.minimumLineSpacing = 1;
            //列间距
            flowLayout.minimumInteritemSpacing = 1;
            //设置item偏移量 上 左 下 右
            flowLayout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0);
            self.collectionView.scrollEnabled = NO;
            
            CGFloat height = (15 / 5 +1) * 30;
            self.collectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width,height) collectionViewLayout:flowLayout];
            [self.contentView addSubview:self.collectionView];
            //注册,必须先创建完collectionView,并且添加到父控件,才能注册,不然会报错
            [self.collectionView registerClass:[TheItemCell class] forCellWithReuseIdentifier:@"Cell"];
            self.collectionView.backgroundColor = [UIColor whiteColor];
            self.backgroundColor = [UIColor orangeColor];
        }
        
        self.collectionView.delegate = self;
        self.collectionView.dataSource = self;
        return self;
    }
    
    - (void)setupCellWithNum:(NSInteger)buttonCount ButtonNameArr:(NSArray *)buttonArray{
        self.cellNum = buttonCount;
        self.buttonTitleArray = buttonArray;
        [self.collectionView reloadData];
    }
    #pragma mark --
    //返回item
    - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
        NSLog(@"%ld",(long)_cellNum);
        return _cellNum;
    }
    //返回组
    - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
        return 1;
    }
    
    
    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
        TheItemCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
        cell.label.text = self.buttonTitleArray[indexPath.item];
        cell.backgroundColor = [UIColor blueColor];
        return cell;
    }
    //点击cell
    - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
        self.buttonClick(indexPath.row);
    }
    
    
    - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
        [super setSelected:selected animated:animated];
    
        // Configure the view for the selected state
    }
    
    @end

    在collectionViewCell.h

    #import <UIKit/UIKit.h>
    
    @interface TheItemCell : UICollectionViewCell
    
    @property (nonatomic,strong) UILabel *label;
    
    @end

    collectionViewCell的.m中

    #import "TheItemCell.h"
    
    @implementation TheItemCell
    
    - (instancetype)initWithFrame:(CGRect)frame{
        self = [super initWithFrame:frame];
        if (self) {
            self.label = [[UILabel alloc]initWithFrame:self.bounds];
            self.label.textAlignment = NSTextAlignmentCenter;
            [self.contentView addSubview:self.label];
        }
        return self;
    }
    
    
    @end
  • 相关阅读:
    ng2-timesheet, 一个timesheet.js的angular2复制版
    Angular 2 + Electron 开发web和桌面应用
    Xamarin.Forms.Platform.Perspex, Xamarin Forms 的 Perspex(号称下一代WPF) 实现
    Visual Studio Xamarin编译Android项目出错的解决办法
    Salesforce + AngularJS + Bootstrap
    NativeScript 也能开发桌面应用 (nativescript-dotnet-runtime)
    iOS集成丁香园DXY OAuth 登陆 swift代码示例
    WinObjC?这是什么鬼?
    如何禁用Marlin温度保护
    React Native也正式发布了
  • 原文地址:https://www.cnblogs.com/losedMemory/p/6140402.html
Copyright © 2020-2023  润新知