UICollectionViewCell dynamic height with autolayout

匿名 (未验证) 提交于 2019-12-03 01:17:01

问题:

I am using auto layout with UICollectionViewCell. So the idea is to allow CollectionViewCell to determine it's size based on layouts. All the constraints are set properly but the problem is that I can not calculate it's size for data source method

collectionView:layout:sizeForItemAtIndexPath: 

Ideally I would like to calculate Cell's height doing the following:

static MyCell *myCell = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{     myCell = [[MyCell alloc] initWithFrame:CGRectZero]; }); cell.model = model; [cell updateConstraints]; [cell layoutSubviews]; return cell.frame.size; 

but it doesn't force constraints to update, so the cell's frame is zero. Can you advice me how can I calculate cell's size based on it's constraints?

Thanks

回答1:

here is the solution

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {     YourCollectionCell * cell = (YourCollectionCell *) [YourCollectionViewObj cellForItemAtIndexPath:indexPath];              if (cell == nil) {                  NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"YourCollectionCell" owner:self options:nil];                 cell = [topLevelObjects objectAtIndex:0];                 cell.frame = CGRectMake(0, 0, CGRectGetWidth(self.view.frame), 20);                 // SET YOUR CONTENT                 [cell layoutIfNeeded];              }              CGSize CellSize = [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize withHorizontalFittingPriority:UILayoutPriorityDefaultHigh verticalFittingPriority:UILayoutPriorityDefaultLow];               return CellSize;  } 


回答2:

I think you should return this size:

return [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 


回答3:

For your dynamic height of the UICollectionViewCell in UIcollectionViewcontroller , you need to implement below method: -

(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 


回答4:

Here is an excellent explanation how to do this for a UITableViewCell: Using Auto Layout in UITableView for dynamic cell layouts & variable row heights. You could use the same approach in your case. See the answer from @Adam Waite in that link for some sample code for a UICollectionViewCell.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!