OC CollectionView和TableView自身高度的隱式遞迴計算,改變父試圖佈局
阿新 • • 發佈:2019-07-11
CollectionView和TableView自身高度的隱式遞迴計算
1、前沿:我們一般會碰到這樣的需求,一個tableview或者一個colletionview放在一個scrollview上邊,而tableview和collectionview的cell是不可控的,更具請求內容變化而變化。如圖:(標籤的多少和標籤的長度不一樣,然而下邊又有一個可以跟著滑動的view)
思路一:根據請求的內容一個一個計算寬度,然後計算行數,根據:表頭+線寬(為了準確)+行間距*行間距個數+行高度*行數+區頭+區尾;
我也這樣考慮過,但是這樣計算量不言而喻。
思路二:考慮最後一個cell的右下定點座標加上一定的高度轉化為tableview的高度,然後走了一點彎路在:
cellForItemAtIndexPath//方法
使用隱式遞迴:(為什麼叫隱式遞迴說明:因為不是寫的遞迴演算法,而是使用cell的重用演算法)
- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ XYimprovenCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath]; CGPoint point = [cell convertPoint:CGPointMake(cell.width, cell.height) toView:self]; self.height = fabs(point.y) + 20; return cell; }
讓每一次cell的右邊定點登入collection的高度;
問題:重用的時候是先載入cell然後賦值高度,不出現的時候將不載入。
然後使用:
- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath{ CGPoint point = [cell convertPoint:CGPointMake(cell.width, cell.height) toView:self]; self.height = fabs(point.y) + 20; if (indexPath.row == _titleArry.count - 1) {//限制在最後一個cell載入時候才返回高度 if (self.allHeight) { self.allHeight(self.height); } } }
因為是cell的reload方法載入cell,在外邊使用這個高度更新別等frame:
_improvenCollectionView.allHeight = ^(CGFloat height) { STRONGSELF //更新高度 strongSelf.bgScrollView.contentSize = CGSizeMake(SCREEN_WIDTH, strongSelf.improvenCollectionView.maxY + 123); strongSelf.buttonSure.frame = CGRectMake(21, 20 + strongSelf.improvenCollectionView.maxY,SCREEN_WIDTH - 2 *21,40); };
是不是有種多麼痛的領悟,轉載請標明出處!
&n