我在自定义 TableViewCell 中有一个 UICollectionView,但我无法自动调整 CollectionView 的大小
Posted
技术标签:
【中文标题】我在自定义 TableViewCell 中有一个 UICollectionView,但我无法自动调整 CollectionView 的大小【英文标题】:I have a UICollectionView in a custom TableViewCell but I can't auto-resize the CollectionView 【发布时间】:2016-05-18 06:06:46 【问题描述】:我在自定义UITableViewCell
中有一个UICollectionView
,在UICollectionView
中只有UIImageView
。我使用SDWebImage
加载图像。我想要的是在加载图像之后,UICollectionView
和它的 contentView(UITableViewCell
) 都会更新自己的高度以显示所有图像。例如,如果我在UICollectionView
中有三张图片,我希望collectionview's
的高度等于所有三张图片的高度总和。
这是一些代码:
TableView
:
- (void)createPostDetailUI
_postDetailTableView = [UITableView new];
_postDetailTableView.delegate = self;
_postDetailTableView.dataSource = self;
_postDetailTableView.estimatedRowHeight = 180;
_postDetailTableView.tableFooterView = [UIView new];
[_postDetailTableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
_postDetailTableView.rowHeight = UITableViewAutomaticDimension;
[self makeConstraints];
- (void)makeConstraints
[_postDetailTableView mas_makeConstraints:^(MASConstraintMaker *make)
UIEdgeInsets padding = UIEdgeInsetsMake(0, 0, 50, 0);
make.edges.equalTo(self.view).insets(padding);
];
- (void)requestPostData
//some request code
[_commentsArray addObjectsFromArray:[PostCommentModel arrayWithResponseObject:responseObject][0]];
[_postDetailTableView reloadData];
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return _commentsArray.count;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
PostDetailHeaderTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PostDetailHeaderTableViewCell" forIndexPath:indexPath];
cell = [[PostDetailHeaderTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"PostDetailHeaderTableViewCell"];
[cell updateCellWithModel:_postModel];
return cell;
UITableViewCell(里面有UICollectionView):
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self)
//some other views
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0);
layout.minimumLineSpacing = 4.0;
layout.estimatedItemSize = CGSizeMake(300, 300);
_postImageCollectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
_postImageCollectionView.backgroundColor = [UIColor clearColor];
_postImageCollectionView.showsHorizontalScrollIndicator = NO;
_postImageCollectionView.autoresizesSubviews = YES;
[_postImageCollectionView registerClass:[PostDetailImageCollectionViewCell class] forCellWithReuseIdentifier:@"PostDetailImageCollectionViewCell"];
_postImageCollectionView.delegate = self;
_postImageCollectionView.dataSource = self;
[self.contentView addSubview:_postImageCollectionView];
[self makeConstraints];
return self;
- (void)makeConstraints
//some other views' autolayout code
[_postImageCollectionView mas_makeConstraints:^(MASConstraintMaker *make)
make.left.equalTo(_postContentLabel);
make.right.equalTo(_postContentLabel);
make.top.equalTo(_postContentLabel.mas_bottom).offset(14);
make.height.greaterThanOrEqualTo(@20);
make.bottom.equalTo(self.contentView).offset(-16);
];
- (void)updateCellWithModel:(PostsModel *)model
_imageArray = [model getImageList];
[_postImageCollectionView reloadData];
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
return 1;
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
return _imageArray.count;
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
PostDetailImageCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"PostDetailImageCollectionViewCell" forIndexPath:indexPath];
NSString *cellImageURL = _imageArray[indexPath.row];
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:cellImageURL] placeholderImage:[UIImage imageNamed:@"icon_default"]];
return cell;
UICollectionViewCell:
- (instancetype)initWithFrame:(CGRect)frame
self = [super initWithFrame:frame];
if (self)
_imageView = [UIImageView new];
_imageView.frame = self.contentView.frame;
_imageView.contentMode = UIViewContentModeScaleAspectFit;
[self.contentView addSubview:_imageView];
return self;
我使用自动布局并使用砖石来管理它。但无论我尝试修复它,它只会显示 20pt 高度。
ps:如何使CollectionViewCell
框架适合图像框架
【问题讨论】:
【参考方案1】:试试这个来计算高度
CGheight height= [self.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height+2;
在你的自定义单元格中添加它并从 collectionview 委托方法中调用它
【讨论】:
首先,非常感谢。但我不明白我把这段代码放在哪个单元格显示?tableviewcell 还是 collectionviewcell?我应该调用哪个 collectionview 委托方法? 把它放在collectionviewcell中并从- (CGSize)collectionView:(UICollectionView )collectionView layout:(UICollectionViewLayout)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath方法调用以上是关于我在自定义 TableViewCell 中有一个 UICollectionView,但我无法自动调整 CollectionView 的大小的主要内容,如果未能解决你的问题,请参考以下文章
无法在自定义 TableViewCell 中编辑 UITextView
在自定义 tableviewcell 中更改 UIImage
TapGestures 在自定义 TableViewCell 中不起作用