Swift:根据细胞数动态改变细胞高度

时间:2017-10-13 07:42:48

标签: ios swift uitableview uicollectionview

我有一个UICollectionView网格系统indexPath.item % 3 == 0 ? largeCellSize : smallCellSize并且它可以工作。 This是它的外观截图。 UICollectionView位于UITableViewCell的单元格内,UITableView位于ViewController内。

UITableViewCell高度取决于UICollectionView中的单元格数。因此,当largeCellSize可用时,单元格高度应该会增加,因为smallCellSize之后的largeCellSize会跟随。

例如:大,小,小 - > 增加细胞高度 - >大,小,小 - > 增加细胞高度 - >等等......而且真的没有倍数,因为大细胞出现在第1,第4,第7,第10,第13,第16等等......

largeCellSize的尺寸为400smallCellSize200。所以基本上,当{em>第1,第4,第7,第10,第13,第16等等时,UITableViewCell大小只会增加400 ... "模式"细胞数量。

如何在适当时确保单元格高度增加400

CODE:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    switch indexPath.row {
    case 0: // Ignore this...
        return 110
    case 1: // Problem is here...
        let productCellCount = self.productsArray.count

        print("---------- heighForRowAt")
        print(productCellCount)

        // I can't seem to get the right logic to show just until the last cell.
        // This shows the last cell and then a bunch of empty space.
        // As for the false, it shows 6 out of the 11 cell and
        // the large cell that it's supposed to show it shows only half of it

        return CGFloat(productCellCount % 3 == 0 ? Double(400 * productCellCount / 2) : 200 * ceil(Double(productCellCount / 2)))
    default:
        return UITableViewAutomaticDimension
    }
}

更新:

为了澄清一下,我在UITableView中有两个单元格,第二个单元格正在填充来自Firebase的数据UICollectionView。随着数据的增加/减少,细胞数量明显会发生变化。根据单元格的数量,UITableViewCell的高度将增加/减少。

3 个答案:

答案 0 :(得分:1)

实施collectionView(_:layout:sizeForItemAt:) UICollectionViewDelegateFlowLayout方法。在那里放置关于indexPath逻辑的所需条件,每次重新加载表时它应该正确呈现

答案 1 :(得分:0)

道歉,我认为以下内容应该符合您的要求:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    switch indexPath.row {
    case 0: // Ignore this...
        return 110
    case 1: // Problem is here...

        let productCellCount : Int = self.productsArray.count
        let remainder : Int = productCellCount % 3
        let numberOfTriads : Int = (productCellCount - remainder) / 3

        print(#function)
        print("PRODUCT CELL COUNT: \(productCellCount) NUMBER OF TRIADS: \(numberOfTriads) REMAINDER: \(remainder)")
        print("REQUIRED HEIGHT: \(((numberOfTriads) * 400) + (remainder > 0 ? 400 : 0))")    
        // New code

        return CGFloat(((numberOfTriads) * 400) + (remainder > 0 ? 400 : 0))

    default:
        return UITableViewAutomaticDimension
    }
}

显然,只有当您确定每三行都需要指定的高度时,这才有效。更强大的实现可能会查询要放置在每个单元格中的集合视图并返回它所需的高度。

希望有所帮助。

答案 2 :(得分:0)

正如你在评论中所说:“如果在uicollectionview中有1-3个单元格,那么表格视图单元格高度应为400,如果是4-6则为800,7-9然后为1200,依此类推”

所以现在你可以做的是你的tableview cellForRowAt方法,你可以检查你的UICollectionView中有多少项,然后将特定高度设置为某个变量并重新加载tableView。稍后在heightForRowAt中将变量高度设置为特定的indexPath.row单元格。