Câu trả lời đúng là CÓ , bạn CÓ THỂ làm điều này.
Tôi đã gặp vấn đề này vài tuần trước. Nó thực sự dễ dàng hơn bạn có thể nghĩ. Đặt các ô của bạn vào NIB (hoặc bảng phân cảnh) và ghim chúng để cho phép bố cục tự động thực hiện tất cả công việc
Cho cấu trúc sau:
TableView
TableViewCell
CollectionView
CollectionViewCell
CollectionViewCell
CollectionViewCell
[... số lượng ô thay đổi hoặc các kích thước ô khác nhau]
Giải pháp là yêu cầu bố cục tự động tính toán kích thước collectionViewCell trước tiên, sau đó đến contentSize của chế độ xem bộ sưu tập và sử dụng nó làm kích thước ô của bạn. Đây là phương pháp UIView "làm nên điều kỳ diệu":
-(void)systemLayoutSizeFittingSize:(CGSize)targetSize
withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority
verticalFittingPriority:(UILayoutPriority)verticalFittingPriority
Bạn phải đặt ở đây kích thước của TableViewCell, trong trường hợp của bạn là kích thước contentSize của CollectionView.
CollectionViewCell
Tại CollectionViewCell, bạn phải yêu cầu ô bố cục mỗi khi bạn thay đổi mô hình (ví dụ: bạn đặt UILabel bằng văn bản, sau đó ô phải được bố trí lại).
- (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
Các TableViewCell làm sự kỳ diệu. Nó có một lối ra cho collectionView của bạn, cho phép bố trí tự động cho các ô collectionView bằng cách sử dụng Kích thước ước tính của UICollectionViewFlowLayout .
Sau đó, mẹo là đặt kích thước ô tableView của bạn tại phương thức systemLayoutSizeFittingSize .... (LƯU Ý: iOS8 trở lên)
LƯU Ý: Tôi đã cố gắng sử dụng phương pháp chiều cao của ô đại biểu của tableView -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
. Nhưng đã quá muộn để hệ thống bố cục tự động tính toán CollectionView contentSize và đôi khi bạn có thể tìm thấy các ô được thay đổi kích thước sai.
@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
Hãy nhớ kích hoạt hệ thống bố cục tự động cho các ô tableView trong TableViewController của bạn :
- (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;
}
CREDIT: @rbarbera đã giúp giải quyết vấn đề này
UITableViewCell
khác với chế độ xem bảng acutal của nó không? Bạn có cần di chuyển dọc trên cảUICollectionView
vàUITableView