Die richtige Antwort ist JA , Sie KANN dies tun.
Ich bin vor einigen Wochen auf dieses Problem gestoßen. Es ist tatsächlich einfacher als Sie vielleicht denken. Legen Sie Ihre Zellen in NIBs (oder Storyboards) und stecken Sie sie fest, damit das automatische Layout die ganze Arbeit erledigt
Bei folgender Struktur:
Tabellenansicht
TableViewCell
CollectionView
CollectionViewCell
CollectionViewCell
CollectionViewCell
[... variable Anzahl von Zellen oder unterschiedliche Zellgrößen]
Die Lösung besteht darin, das automatische Layout anzuweisen, zuerst die Größe der collectionViewCell, dann die Größe der Sammlungsansicht contentSize zu berechnen und als Größe Ihrer Zelle zu verwenden. Dies ist die UIView- Methode, die "die Magie macht":
-(void)systemLayoutSizeFittingSize:(CGSize)targetSize
withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority
verticalFittingPriority:(UILayoutPriority)verticalFittingPriority
Sie müssen hier die Größe der TableViewCell festlegen, in Ihrem Fall die contentSize der CollectionView.
CollectionViewCell
In der CollectionViewCell müssen Sie die Zelle bei jedem Modellwechsel anweisen, ein Layout zu erstellen (z. B. wenn Sie ein UILabel mit einem Text festlegen, muss die Zelle erneut ein Layout aufweisen).
- (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
Die TableViewCell macht die Magie. Es verfügt über einen Auslass zu Ihrer Kollektion, ermöglicht das automatische Layout für Collection Zellen mit estimatedItemSize des UICollectionViewFlowLayout .
Der Trick besteht dann darin, die Größe Ihrer tableView-Zelle mit der systemLayoutSizeFittingSize ... -Methode festzulegen . (HINWEIS: iOS8 oder höher)
ANMERKUNG: Ich habe versucht, die Höhenmethode der delegierten Zelle in tableView zu -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
verwenden. Es ist jedoch zu spät für das automatische Layoutsystem, die CollectionView contentSize zu berechnen, und manchmal finden Sie möglicherweise Zellen mit falscher Größenänderung.
@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
Denken Sie daran, das automatische Layoutsystem für die tableView-Zellen in Ihrem TableViewController zu aktivieren :
- (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 hat geholfen, das zu klären
UITableViewCell
sich von seiner acutal Tableview?UICollectionView
UITableView