คำตอบที่ถูกต้องใช่คุณสามารถทำเช่นนี้
ฉันเจอปัญหานี้เมื่อหลายสัปดาห์ก่อน มันง่ายกว่าที่คุณคิดจริงๆ ใส่เซลล์ของคุณลงใน NIB (หรือสตอรีบอร์ด) แล้วตรึงไว้เพื่อให้การจัดวางอัตโนมัติทำงานทั้งหมด
ให้โครงสร้างต่อไปนี้:
tableView
TableViewCell
CollectionView
CollectionViewCell
CollectionViewCell
CollectionViewCell
[... จำนวนเซลล์หรือขนาดเซลล์ที่แตกต่างกัน]
วิธีแก้ปัญหาคือบอกให้เค้าโครงอัตโนมัติคำนวณขนาด collectionViewCell ก่อนจากนั้นคอลเลกชันดู contentSize และใช้เป็นขนาดของเซลล์ของคุณ นี่คือวิธีการUIViewที่ "ใช้เวทมนตร์":
-(void)systemLayoutSizeFittingSize:(CGSize)targetSize
withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority
verticalFittingPriority:(UILayoutPriority)verticalFittingPriority
คุณต้องกำหนดขนาดของ TableViewCell ที่นี่ซึ่งในกรณีของคุณคือ contentSize ของ CollectionView
CollectionViewCell
ที่CollectionViewCellคุณต้องบอกให้เซลล์จัดวางทุกครั้งที่คุณเปลี่ยนโมเดล (เช่นคุณตั้งค่า UILabel ด้วยข้อความจากนั้นเซลล์จะต้องถูกจัดวางอีกครั้ง)
- (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ไม่มายากล มันมีทางออกที่จะ collectionView ของคุณช่วยให้รูปแบบอัตโนมัติสำหรับเซลล์ collectionView ใช้estimatedItemSizeของUICollectionViewFlowLayout
จากนั้นเคล็ดลับคือการกำหนดขนาดเซลล์ tableView ของคุณที่เมธอด systemLayoutSizeFittingSize ... (หมายเหตุ: iOS8 หรือใหม่กว่า)
หมายเหตุ: ฉันพยายามใช้วิธีความสูงของเซลล์ผู้รับมอบสิทธิ์ของ tableView -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
แต่มันสายเกินไปที่ระบบเค้าโครงอัตโนมัติจะคำนวณ CollectionView contentSize และบางครั้งคุณอาจพบเซลล์ที่ปรับขนาดไม่ถูกต้อง
@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
อย่าลืมเปิดใช้งานระบบเค้าโครงอัตโนมัติสำหรับเซลล์ tableView ที่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;
}
เครดิต: @rbarberaช่วยจัดเรียงสิ่งนี้
UITableViewCell
แตกต่างจากมุมมองตารางเฉียบพลันหรือไม่? คุณไม่จำเป็นต้องเลื่อนแนวตั้งทั้งในUICollectionView
และUITableView