La bonne réponse est OUI , vous POUVEZ le faire.
J'ai rencontré ce problème il y a quelques semaines. C'est en fait plus facile que vous ne le pensez. Placez vos cellules dans des NIB (ou des storyboards) et épinglez-les pour laisser la mise en page automatique faire tout le travail
Compte tenu de la structure suivante:
Vue de tableau
TableViewCell
CollectionView
CollectionViewCell
CollectionViewCell
CollectionViewCell
[... nombre variable de cellules ou différentes tailles de cellules]
La solution consiste à indiquer à la disposition automatique de calculer d'abord les tailles de collectionViewCell, puis la vue de collection contentSize et de l'utiliser comme taille de votre cellule. C'est la méthode UIView qui "fait la magie":
-(void)systemLayoutSizeFittingSize:(CGSize)targetSize
withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority
verticalFittingPriority:(UILayoutPriority)verticalFittingPriority
Vous devez définir ici la taille de TableViewCell, qui dans votre cas est contentSize de CollectionView.
CollectionViewCell
Au CollectionViewCell, vous devez indiquer à la cellule de se mettre en page à chaque fois que vous changez de modèle (par exemple: vous définissez un UILabel avec un texte, puis la cellule doit être mise en page à nouveau).
- (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
Le TableViewCell fait la magie. Il a une sortie à votre CollectionView, permet la mise en page automatique pour les cellules en utilisant CollectionView estimatedItemSize du UICollectionViewFlowLayout .
Ensuite, l'astuce consiste à définir la taille de votre cellule tableView à la méthode systemLayoutSizeFittingSize ... (REMARQUE: iOS8 ou version ultérieure)
NOTE: J'ai essayé d'utiliser la méthode de la hauteur de la cellule de délégué du tableView -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
.mais il est trop tard pour le système de mise en page automatique pour calculer la CollectionView contentSize et parfois vous pouvez trouver de mauvaises cellules redimensionnées.
@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
N'oubliez pas d'activer le système de disposition automatique pour les cellules tableView sur votre TableViewController :
- (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;
}
CRÉDIT: @rbarbera a aidé à résoudre ce problème
UITableViewCell
tableau est-elle différente de sa vue de table réelle? Avez-vous besoin d'un défilement vertical sur leUICollectionView
et leUITableView