정답은 YES입니다 . 할 수 있습니다.
몇 주 전에이 문제를 발견했습니다. 실제로 생각보다 쉽습니다. 셀을 NIB (또는 스토리 보드)에 넣고 고정하여 자동 레이아웃이 모든 작업을 수행하도록합니다.
다음과 같은 구조가 주어집니다.
TableView
TableViewCell
CollectionView
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
acutal tableview 와 다른가요? 당신은 모두에 수직 스크롤해야합니까UICollectionView
와UITableView