Jawaban yang benar adalah YA , Anda BISA melakukan ini.
Saya menemukan masalah ini beberapa minggu lalu. Ini sebenarnya lebih mudah dari yang Anda kira. Letakkan sel Anda di NIB (atau storyboard) dan sematkan agar tata letak otomatis melakukan semua pekerjaan
Diberikan struktur berikut:
TableView
TableViewCell
CollectionView
CollectionViewCell
CollectionViewCell
CollectionViewCell
[... jumlah sel variabel atau ukuran sel berbeda]
Solusinya adalah memberi tahu tata letak otomatis untuk menghitung ukuran collectionViewCell terlebih dahulu, lalu tampilan koleksi contentSize, dan menggunakannya sebagai ukuran sel Anda. Ini adalah metode UIView yang "melakukan keajaiban":
-(void)systemLayoutSizeFittingSize:(CGSize)targetSize
withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority
verticalFittingPriority:(UILayoutPriority)verticalFittingPriority
Anda harus menyetel di sini ukuran TableViewCell, yang dalam kasus Anda adalah contentSize CollectionView.
CollectionViewCell
Pada CollectionViewCell Anda harus memberi tahu sel ke tata letak setiap kali Anda mengubah model (misalnya: Anda menyetel UILabel dengan teks, maka sel tersebut harus di tata letak lagi).
- (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
The TableViewCell melakukan keajaiban. Ini memiliki outlet untuk CollectionView Anda, memungkinkan tata letak otomatis untuk sel CollectionView menggunakan estimatedItemSize dari UICollectionViewFlowLayout .
Kemudian, triknya adalah menyetel ukuran sel tableView Anda pada metode systemLayoutSizeFittingSize .... (CATATAN: iOS8 atau lebih baru)
CATATAN: Saya mencoba menggunakan metode ketinggian sel delegasi dari tableView. -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
Tetapi sudah terlambat bagi sistem tata letak otomatis untuk menghitung CollectionView contentSize dan terkadang Anda mungkin menemukan sel yang diubah ukurannya salah.
@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
Ingatlah untuk mengaktifkan sistem tata letak otomatis untuk sel tableView di TableViewController Anda :
- (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;
}
KREDIT: @rbarbera membantu menyelesaikan masalah ini
UITableViewCell
berbeda dari tampilan tabel acutal-nya? Apakah Anda memerlukan pengguliran vertikal padaUICollectionView
danUITableView