Doğru cevap EVET , bunu YAPABİLİRSİNİZ .
Bu problemle birkaç hafta önce karşılaştım. Aslında düşündüğünüzden daha kolay. Hücrelerinizi NIB'lere (veya hikaye tahtalarına) yerleştirin ve otomatik düzenin tüm işi yapmasına izin vermek için onları sabitleyin
Aşağıdaki yapı göz önüne alındığında:
Tablo görünümü
TableViewCell
CollectionView
CollectionViewCell
CollectionViewCell
CollectionViewCell
[... değişken sayıda hücre veya farklı hücre boyutları]
Çözüm, auto layout'a önce collectionViewCell boyutlarını hesaplamasını, ardından koleksiyonun contentSize boyutunu hesaplamasını ve bunu hücrenizin boyutu olarak kullanmasını söylemektir. Bu, "sihir yapan" UIView yöntemidir:
-(void)systemLayoutSizeFittingSize:(CGSize)targetSize
withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority
verticalFittingPriority:(UILayoutPriority)verticalFittingPriority
Burada, sizin durumunuzda CollectionView'un contentSize olan TableViewCell'in boyutunu ayarlamanız gerekir.
CollectionViewCell
At CollectionViewCell Eğer modelini değiştirmek her zaman düzeni için hücreyi anlatmak zorunda (örn: bir metin ile bir UILabel ayarlayın, ardından hücre yeniden düzen olmak zorundadır).
- (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 büyü yapar. Bu sizin CollectionView'ın için bir çıkışa sahiptir kullanarak CollectionView'ın hücreleri için otomatik düzenini sağlayan estimatedItemSize ait UICollectionViewFlowLayout .
Daha sonra işin püf noktası , tableView hücrenizin boyutunu systemLayoutSizeFittingSize ... yönteminde ayarlamaktır. (NOT: iOS8 veya üzeri)
NOT: Ben tableView delegesi hücrenin yüksekliği yöntemini kullanmaya çalıştı -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
.ama çok geç CollectionView contentSize hesaplamak için otomatik düzen sisteminin ve bazen yanlış boyutlandýrýlmýþ hücreleri bulabilirsiniz.
@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'ınızda tableView hücreleri için otomatik düzen sistemini etkinleştirmeyi unutmayı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;
}
KREDİ: @rbarbera bunu çözmemize yardımcı oldu
UITableViewCell
keskin masa görünümünden farklı mı? Her iki dikey kaydırma gerekiyor muUICollectionView
veUITableView