• 动态的计算行高 加载数据源 有多少显示多少 tableView 包含 colloctionView 显示复杂的界面写法


    有时候,我们经常碰到这样的需求 

    先遵守代理

    @interface PublishCollectionCell ()<UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout>

    创建

        _layout = [[UICollectionViewFlowLayout alloc] init];

        //        layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;

    //    _collectionView = [UICollectionView new];

        _collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, self.width, self.height) collectionViewLayout:_layout];

    //    _collectionView.showsHorizontalScrollIndicator = NO;

        _collectionView.scrollEnabled = NO;

        [_collectionView setBackgroundView:nil];

        [_collectionView setBackgroundColor:[UIColor clearColor]];

        [_collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"];

        _collectionView.dataSource = self;

        _collectionView.delegate = self;

        [self.contentView addSubview:_collectionView];

    你可以先获取cell的高度  设置 cell的默认高  

    + (CGFloat)cellHeightWithObj:(NSArray *)obj{

        if (obj.count == 0) return 0;

        PublishLayout *publishLayout = obj[0];

        CGFloat cellHeight = 0;

        NSInteger row;

        if (obj.count <= 0) {

            row = 1;

        }else{

            row = ceilf((float)obj.count/publishLayout.showConutInRow);

        }

        cellHeight += (25 + 10) *row;

        

        return cellHeight;

    }

    根据不同的显示 加载不同的数据源分类 

    - (void)setDataSource:(NSArray *)dataSource {

        _dataSource = dataSource;

        if (_dataSource.count == 0) return;

     switch (_type) {

            case PublishLayoutType_SexLimit:{

                _layout.minimumInteritemSpacing = 20.0;

                _layout.itemSize = CGSizeMake(70, 25);

                ccellItemHeight = 20;

                [_collectionView mas_remakeConstraints:^(MASConstraintMaker *make) {

                    make.left.equalTo(_label.mas_right).offset(20);

                    make.top.equalTo(self.contentView);

                    make.width.mas_equalTo(250);

                    make.height.mas_equalTo([PublishCollectionCell cellHeightWithObj:_dataSource]);

                }];

            }

                

                break;

            case PublishLayoutType_LocationLimit:{

                _layout.minimumInteritemSpacing = 20.0;

                _layout.itemSize = CGSizeMake(70, 25);

                ccellItemHeight = 20;

                [_collectionView mas_remakeConstraints:^(MASConstraintMaker *make) {

                    make.left.equalTo(_label.mas_right).offset(20);

                    make.top.equalTo(self.contentView);

                    make.width.mas_equalTo(160);

                    make.height.mas_equalTo([PublishCollectionCell cellHeightWithObj:_dataSource]);

                }];

            }

                

                break;

            case PublishLayoutType_Server:{

                if ([UIScreen mainScreen].bounds.size.width== 320) {

                    _layout.minimumInteritemSpacing = 10.0;

                    _layout.itemSize = CGSizeMake(60, 25);

                    ccellItemHeight = 25;

                    [_collectionView mas_remakeConstraints:^(MASConstraintMaker *make) {

                        make.left.equalTo(_label.mas_right).offset(20);

                        make.top.equalTo(self.contentView);

                        make.width.mas_equalTo(210);

                        make.height.mas_equalTo([PublishCollectionCell cellHeightWithObj:_dataSource]);

                    }];

                    

                }else{

                _layout.minimumInteritemSpacing = 20.0;

                _layout.itemSize = CGSizeMake(70, 25);

                ccellItemHeight = 25;

                [_collectionView mas_remakeConstraints:^(MASConstraintMaker *make) {

                    make.left.equalTo(_label.mas_right).offset(20);

                    make.top.equalTo(self.contentView);

                    make.width.mas_equalTo(250);

                    make.height.mas_equalTo([PublishCollectionCell cellHeightWithObj:_dataSource]);

                }];

                }

            }

                

                break;

            case PublishLayoutType_Props:{

                _layout.minimumInteritemSpacing = 20.0;

                CGFloat itemMaxWidth = 0;

                for (Props *props in _dataSource) {

                    CGFloat width = [props.name getSizeWithFont:DefualtButtonTitileFont constrainedToSize:CGSizeMake(MAXFLOAT, DefualtButtonTitileFontSize)].width;

                    if (width > itemMaxWidth) {

                        itemMaxWidth = width;

                    }

                }

                PublishLayout *publishLayout = _dataSource[0];

                itemMaxWidth = publishLayout.buttonImage.size.width + 5 + itemMaxWidth;

                _layout.itemSize = CGSizeMake(itemMaxWidth, 25);

                ccellItemHeight = 20;

                CGFloat width = _layout.minimumInteritemSpacing + itemMaxWidth*2;

                [_collectionView mas_remakeConstraints:^(MASConstraintMaker *make) {

                    make.left.equalTo(_label.mas_right).offset(20);

                    make.top.equalTo(self.contentView);

                    make.width.mas_equalTo(width);

                    make.height.mas_equalTo([PublishCollectionCell cellHeightWithObj:_dataSource]);

                }];

            }

                

                break;

                

            default:

                break;

        }

    //    _collectionView.collectionViewLayout = layout;

        [_collectionView reloadData];

    }

     展示的时候 

       _tableView = ({

            UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];

            tableView.backgroundColor = [UIColor clearColor];

            tableView.dataSource = self;

            tableView.delegate = self;

            tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

            [tableView registerClass:[PublishLimitCell class] forCellReuseIdentifier:NSStringFromClass(PublishLimitCell.class)];

            [tableView registerClass:[PublishCollectionCell class] forCellReuseIdentifier:NSStringFromClass(PublishCollectionCell.class)];

            [self.view addSubview:tableView];

            [tableView mas_makeConstraints:^(MASConstraintMaker *make) {

                make.top.equalTo(_addTopicButton.mas_bottom).offset(30);

                make.left.right.equalTo(self.view);

                make.bottom.equalTo(_shareCollectionView.mas_top).offset(-10);

            }];

            

            tableView;

        });

     用tableView 加载不同的cell 类型  复杂界面首选  整理的tableView 包含colloctionView 的写法 

    不过首先 可以写一个枚举

    typedef NS_ENUM(NSInteger, PublishLayoutType) {

        PublishLayoutType_SexLimit = 0,

        PublishLayoutType_LocationLimit,

        PublishLayoutType_Server,

        PublishLayoutType_Props,

    };

    根据不同的类型 加载不同的数据源 

    #pragma mark - UITableViewDataSource

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

        return _store.numberOfRows;

    }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

        PublishCollectionCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass(PublishCollectionCell.class) forIndexPath:indexPath];

        switch (indexPath.row) {

            case 0:

                cell.label.text = @"对方性别";

                cell.type = PublishLayoutType_SexLimit;

                cell.dataSource = (NSArray *)_store.sexLimits;

                break;

            case 1:

                cell.label.text = @"对方位置";

                cell.type = PublishLayoutType_LocationLimit;

                cell.dataSource = (NSArray *)_store.locationLimits;

                break;

            case 2:

                cell.label.text = @"寻求服务";

                cell.type = PublishLayoutType_Server;

                cell.dataSource = (NSArray *)_store.serviceList;

                break;

            case 3:

                cell.label.text = @"预算赏金";

                cell.type = PublishLayoutType_Props;

                cell.dataSource = (NSArray *)_store.cards;

                

                break;

                

            default:

                break;

        }

        [cell setClickedBlock:^(PublishLayout *_layout) {

            if (_layout.layoutType == PublishLayoutType_Props) {

                if (_layout.isSelected) {

                    _layout.isSelected = !_layout.isSelected;

                    [_store updateList:_layout];

                    [_tableView reloadData];

                } else {

                    [CountControlView showChooseNumInSubVC:self withCommitBlock:^(NSInteger chooseNum) {

                        _layout.propsNumber = chooseNum;

                        _layout.isSelected = !_layout.isSelected;

                        [_store updateList:_layout];

                        [_tableView reloadData];

                    }];

                }

                

            } else {

                if (_layout.layoutType == PublishLayoutType_LocationLimit) {

                    if (_layout.recruitLimit.limitId.integerValue == _store.locationLimit.integerValue) {

                        return;

                    }

                }

                

                if (_layout.layoutType == PublishLayoutType_SexLimit) {

                    if (_layout.recruitLimit.limitId.integerValue == _store.sexLimit.integerValue) {

                        return;

                    }

                }

                

                _layout.isSelected = !_layout.isSelected;

                if (_layout.isSelected && _layout.layoutType==PublishLayoutType_LocationLimit) {

                    [self resignTitleResponder];

                    if (!self.store.isLocationSuccess && [AppLogic getCityName].length==0) {

                        CNShowPromptWithText(@"请打开定位或完善资料");

                        return ;

                    } else{

                        

                    }

                }

                

                [_store updateList:_layout];

                [_tableView reloadData];

            }

        }];

        return cell;

    }

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

        if (indexPath.row < 2) {

            return 45;

        } else if (indexPath.row == 2) {

            return [PublishCollectionCell cellHeightWithObj:_store.serviceList];

        }else if (indexPath.row == 3) {

            return [PublishCollectionCell cellHeightWithObj:_store.cards];

        }

        

        return 0;

    }

    #pragma mark - UICollectionViewDataSource

    - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {

        if ([collectionView isEqual:self.rewardCollectionView]) {

            return self.store.propsArray.count;

        } else {

            return 5;

        }

    }

    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

        if ([collectionView isEqual:self.rewardCollectionView]) {

            PublishCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"reward" forIndexPath:indexPath];

    //        cell.props = self.store.propsArray[indexPath.row];

            [cell setProps:self.store.propsArray[indexPath.row] IndexPath:indexPath SelectYes:self.isShake];

            [cell setDeleteImgRow:^(NSInteger row) {

                [self.store.propsArray removeObjectAtIndex:row];

                self.isShake = NO;

                if (self.store.propsArray.count > 0) {

                    self.rewardLabel.hidden = YES;

                    self.rewardCollectionView.hidden = NO;

                } else {

                    self.rewardLabel.hidden = NO;

                    self.rewardCollectionView.hidden = YES;

                }

                 [self.rewardCollectionView reloadData];

            }];

            

            [cell setIsShake:^(BOOL shake) {

                self.isShake = YES;

                [self.rewardCollectionView reloadData];

            }];

            return cell;

        } else {

            PublishCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"share" forIndexPath:indexPath];

            NSString *imageNamed = @"";

            switch (indexPath.row) {

                case 0:

                    imageNamed = @"share_weixin";

                    break;

                case 1:

                    imageNamed = @"share_QZone";

                    break;

                case 2:

                    imageNamed = @"share_WechatTimeline";

                    break;

                case 3:

                    imageNamed = @"share_qq";

                    break;

                case 4:

                    imageNamed = @"share_weibo";

                    break;

                    

                default:

                    break;

            }

            

            if (_store.shareType == indexPath.row) {

                imageNamed = [imageNamed stringByAppendingString:@"_sel"];

            } else {

                imageNamed = [imageNamed stringByAppendingString:@"_nor"];

            }

            cell.contengImageView.image = [UIImage imageNamed:imageNamed];

            return cell;

        }

        return nil;

    }

    - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {

        if ([collectionView isEqual:self.shareCollectionView]) {

            if (_store.shareType != indexPath.row) {

                _store.shareType = indexPath.row;

            } else {

                _store.shareType = KShareTypeNone;

            }

            [self.shareCollectionView reloadData];

        }

        else if([collectionView isEqual:self.rewardCollectionView]){

            NSLog(@"%ld",(long)indexPath.row);

        }

    }

     大概的整体思路 就是这样, 最近会写一个demo 然后放到git上 若需要可以评论 @我 

  • 相关阅读:
    基于opencv网络摄像头在ubuntu下的视频获取
    VHDL学习札记:library and Package
    HLS入门收集(1)
    Windows下zlib库和libPng库的编译和使用
    FPGA培训体会 江苏大学 自动化 许一航
    FPGA学习体会
    FPGA培训体会
    2016年上海V3学院寒假班FPGA/SOC培训收获
    上海V3学院FPGA培训感想 ——重庆理工大学叶钧
    上海招聘FPGA讲师(专兼职均可)
  • 原文地址:https://www.cnblogs.com/tangyuanby2/p/6097306.html
Copyright © 2020-2023  润新知