1. 程式人生 > >OC CollectionView和TableView自身高度的隱式遞迴計算,改變父試圖佈局

OC CollectionView和TableView自身高度的隱式遞迴計算,改變父試圖佈局

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