如何根据numberOfItemsInSection的数量设置heightForRowAt?

时间:2017-04-19 04:03:01

标签: ios swift uitableview uicollectionview

我正在使用UITableViewController并将UICollectionView放在表格视图单元格的第二行中。问题是如何动态获取heightForRowAt。

我尝试过使用return UITableViewAutomaticDimension。但是没有工作。

非常感谢任何帮助。

viewDidLoad中

override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.estimatedRowHeight = self.tableView.rowHeight
        self.tableView.rowHeight = UITableViewAutomaticDimension
    }

的UITableViewController

选项1

 override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return self.tableView.bounds.width + 15
    }

选项2

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }

override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }

目前,我硬编码返回的数量。

UICollectionViewDataSource

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 15
    }

UICollectionViewDelegate,UICollectionViewDelegateFlowLayout

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

        let layout = collectionViewLayout as! UICollectionViewFlowLayout
        layout.minimumLineSpacing = 2.5
        layout.minimumInteritemSpacing = 2.5

        itemWidth = (collectionView.bounds.width - 5.0) / 3.0
        return CGSize(width: itemWidth, height: itemWidth)
    }

以下是使用return self.tableView.bounds.width + 15的用户界面的图片:

enter image description here

以下是使用return UITableViewAutomaticDimension的用户界面的图片:

enter image description here

这是约束的图像:

enter image description here

3 个答案:

答案 0 :(得分:0)

在viewDidLoad()中尝试添加 - :

 override func viewDidLoad() {
        super.viewDidLoad()

       yourTableView.estimatedRowHeight = 70 // this is your storyboard default cell height 
       yourtableView.rowHeight = UITableViewAutomaticDimension //Automatic dimensions

    }

然后试试这个 - :

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }

答案 1 :(得分:0)

在您的情况下,您必须为具有集合视图的单元格提供动态高度,具体取决于集合视图的内容高度,但在加载表视图时,时间可能是您的集合视图不会完全加载那个时候你的集合视图的内容高度可能不对。

为了获得正确的内容高度,您必须计算集合视图的内容高度,如下所示:

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

//Your cell which has a collectionview
    if indexPath.row == 1{ 
    let contentHeight = (numberOfCollectionViewcell*itemHeight)+collectionViewContentOffset
    return contentHeight
    }
            return self.tableView.bounds.width + 15
        }

答案 2 :(得分:0)

  1. 来自CollectionViewDelegate yon可以识别collectionview何时完全加载

  2. 获取CollectionView内容高度。

  3. 通过创建委托将此内容高度发送到tableView VC。

  4. 在委托方法reload tableView

  5. tableViewCell CollectionView已经重新加载,所以每当你执行上面的方法时,编译器会转到infinity来重新加载tableView和collectionView。为此你需要添加一个标志(isForcefullyReloadCollectionView),当tableview是tableview需要重新加载时,标志为true,否则为false。您需要在强制重新加载tableView的位置添加此标志。

  6. 请执行以上操作,如果您需要进一步的帮助,可以询问。如果我有任何其他解决方案,那么我会更新你。