正确的答案是YES,你CAN做到这一点。
几周前我遇到了这个问题。实际上,它比您想象的要容易。将您的单元格放入NIB(或情节提要)中并将其固定,以使自动布局完成所有工作
给出以下结构:
表格检视
TableViewCell
集合视图
CollectionViewCell
CollectionViewCell
CollectionViewCell
[...可变的细胞数或不同的细胞大小]
解决方案是告诉自动布局首先计算collectionViewCell的大小,然后计算集合视图的contentSize,然后将其用作单元格的大小。这是“做魔术” 的UIView方法:
-(void)systemLayoutSizeFittingSize:(CGSize)targetSize
withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority
verticalFittingPriority:(UILayoutPriority)verticalFittingPriority
您必须在此处设置TableViewCell的大小,在您的情况下为CollectionView的contentSize。
CollectionViewCell
在CollectionViewCell上,每次更改模型时,您必须告诉单元进行布局(例如:使用文本设置UILabel,然后必须再次对单元进行布局)。
- (void)bindWithModel:(id)model {
// Do whatever you may need to bind with your data and
// tell the collection view cell's contentView to resize
[self.contentView setNeedsLayout];
}
// Other stuff here...
TableViewCell
该TableViewCell确实神奇。它有一个出口,以您的的CollectionView,能够使用的CollectionView细胞自动布局estimatedItemSize的的UICollectionViewFlowLayout。
然后,诀窍是在systemLayoutSizeFittingSize ...方法中设置tableView单元格的大小。(注意:iOS8或更高版本)
注:我试图用的tableView的代表单元的高度方法-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
。但为时已晚的自动布局系统来计算的CollectionView contentSize,有时你可能会发现错误调整大小的细胞。
@implementation TableCell
- (void)awakeFromNib {
[super awakeFromNib];
UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout;
// Configure the collectionView
flow.minimumInteritemSpacing = ...;
// This enables the magic of auto layout.
// Setting estimatedItemSize different to CGSizeZero
// on flow Layout enables auto layout for collectionView cells.
// https://developer.apple.com/videos/play/wwdc2014-226/
flow.estimatedItemSize = CGSizeMake(1, 1);
// Disable the scroll on your collection view
// to avoid running into multiple scroll issues.
[self.collectionView setScrollEnabled:NO];
}
- (void)bindWithModel:(id)model {
// Do your stuff here to configure the tableViewCell
// Tell the cell to redraw its contentView
[self.contentView layoutIfNeeded];
}
// THIS IS THE MOST IMPORTANT METHOD
//
// This method tells the auto layout
// You cannot calculate the collectionView content size in any other place,
// because you run into race condition issues.
// NOTE: Works for iOS 8 or later
- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority verticalFittingPriority:(UILayoutPriority)verticalFittingPriority {
// With autolayout enabled on collection view's cells we need to force a collection view relayout with the shown size (width)
self.collectionView.frame = CGRectMake(0, 0, targetSize.width, MAXFLOAT);
[self.collectionView layoutIfNeeded];
// If the cell's size has to be exactly the content
// Size of the collection View, just return the
// collectionViewLayout's collectionViewContentSize.
return [self.collectionView.collectionViewLayout collectionViewContentSize];
}
// Other stuff here...
@end
TableViewController
记住要在TableViewController上为tableView单元格启用自动布局系统:
- (void)viewDidLoad {
[super viewDidLoad];
// Enable automatic row auto layout calculations
self.tableView.rowHeight = UITableViewAutomaticDimension;
// Set the estimatedRowHeight to a non-0 value to enable auto layout.
self.tableView.estimatedRowHeight = 10;
}
信用:@rbarbera帮助解决了这个问题
UITableViewCell
与其原始表格视图不同吗?您需要同时在UICollectionView
和上垂直滚动吗?UITableView