首页 > 其他 > 详细

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

时间:2016-11-24 15:39:02      阅读:355      评论:0      收藏:0      [点我收藏+]

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

 

先遵守代理

@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上 若需要可以评论 @我 

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

原文:http://www.cnblogs.com/tangyuanby2/p/6097306.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!