Swift:根据其中的UICollectionView的大小扩展UITableViewCell高度

时间:2016-07-21 03:03:57

标签: ios swift uitableview uicollectionview cell

大家好。我在一个月前开始学习编程,所以如果我不能很好地解释我的问题,请保持良好状态:)

我的项目由主UITableView组成。在UITableView的每个单元格中,我有一个UICollectionView(在水平滚动上)。

Img 1 : Main view

每个UICollectionViewCell宽度与整个UITableViewCell相同。我的第一个问题是调整UITableViewCell 的高度(这取决于UICollectionView本身的大小以及内容的大小)。

Img 2 : CollectionView

这必须自动完成。事实上,UICollectionViewCell不会有相同的高度,因此当用户水平滚动UICollectionView时,会出现一个新的UICollectionViewCell(不同的高度)和UITableViewCell的高度必须适应。

我遇到的第二个问题是调整UICollectionViewCell的大小,事实上我事先并不知道它的高度是什么(宽度与UITableView相同)。我应该从笔尖导入内容。

所以现在这是我的ViewController文件,

变量:

@IBOutlet weak var tableView: UITableView!
var storedOffsets = [Int: CGFloat]()

UITableView扩展程序:创建UITableView的单元格并在其中设置UICollectionView的委托

extension IndexVC: UITableViewDelegate, UITableViewDataSource {
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 6 //Temp
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCellWithIdentifier("CellCollectionView") as? CellPost {
        let post = self.posts[indexPath.row]
        cell.configureCell(post)

        return cell
    } else {
        return CellPost()
    }

}

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    guard let tableViewCell = cell as? CellPost else { return }

    tableViewCell.setCollectionViewDataSourceDelegate(self, forRow: indexPath.row)
    tableViewCell.collectionViewOffset = storedOffsets[indexPath.row] ?? 0
}

func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    guard let tableViewCell = cell as? CellPost else { return }

    storedOffsets[indexPath.row] = tableViewCell.collectionViewOffset
}

UICollectionView的一部分:将视图从Nib / xib添加到单元格

extension IndexVC: UICollectionViewDelegate, UICollectionViewDataSource {
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 9 //Temp
}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cellInCollectionView", forIndexPath: indexPath)

    if let textPostView = NSBundle.mainBundle().loadNibNamed("textPostView", owner: self, options: nil).first as? textPostView {
        textPostView.configurePost(post.descriptionLbl)
        cell.addSubview(textPostView)
        textPostView.translatesAutoresizingMaskIntoConstraints = false
        cell.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[view]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":textPostView]))
        cell.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[view]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":textPostView]))

    }

    return cell
}

使单元格的大小与整个UICollectionView

相同
extension IndexVC: UICollectionViewDelegateFlowLayout {
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    return CGSizeMake(collectionView.frame.width, collectionView.frame.height)
}

我在专用于UITableViewCell的类中创建了此扩展(对问题没用,但是如果有人想要重新创建它)

extension CellPost {
func setCollectionViewDataSourceDelegate<D: protocol<UICollectionViewDataSource, UICollectionViewDelegate>>(dataSourceDelegate: D, forRow row: Int) {

    collectionView.delegate = dataSourceDelegate
    collectionView.dataSource = dataSourceDelegate
    collectionView.tag = row
    collectionView.setContentOffset(collectionView.contentOffset, animated:false) // Stops collection view if it was scrolling.
    collectionView.reloadData()
}

var collectionViewOffset: CGFloat {
    set {
        collectionView.contentOffset.x = newValue
    }

    get {
        return collectionView.contentOffset.x
    }
}

如果有人想要使用此代码,那么效果很好,但我必须使用UITableView

tableView( ... heightForRowAtIndexPath ...)的高度进行硬编码

我尝试了一切让UITableViewCell适应其中的内容(我尝试计算笔尖发送到内容中的内容的大小,然后将其发送到tableView( ... heightForRowAtIndexPath ...) 但我不能让它发挥作用。我也尝试了自动布局,但也许我做错了。我也认为问题可能来自我在我的单元格中导入笔尖的部分。

我也不知道在用户刷过UICollectionViewCell之后扩展单元格的方法,有没有办法在发生这种情况时创建一个事件?也许再次致电tableView( ... heightForRowAtIndexPath ...)

2 个答案:

答案 0 :(得分:2)

据我了解,您需要自动调整tableview单元格高度。所以你可以使用autolayout来调整单元格高度。

在ViewDidLoad中写入

self.tableView.estimatedRowHeight = 80
self.tableView.rowHeight = UITableViewAutomaticDimension

在CellForRowAtIndexPath中返回单元格之前

self.tableView.setNeedsLayout()
self.tableView.layoutIfNeeded()

您可以找到autolayout的链接。 enter link description here

答案 1 :(得分:0)

为了解决我的问题,我创建了一个数组来存储UITableView(名为cellHeight)的每个单元格的高度。

我还在由数组(名为cellHeightForPost)组成的数组中计算程序开头的每个单元格的高度。主数组代表所有TableView cells,其中的每个数组代表'collectionView'的每个单元格的高度

为了更新每次我更改其中的collectionView时,我都使用了函数collectionView(... willDiplayCell...)

self.tableView.beginUpdates()
cellHeight[collectionView.tag] = cellHeightForPost[collectionView.tag][indexPath.row]
self.tableView.setNeedsLayout()
self.tableView.layoutIfNeeded()
self.tableView.endUpdates()

我的 UITableView尺寸tableView(... heightForRowAtIndexPath)tableView(... estimatedHeightForRowAtIndexPath)中定义:

return cellHeight[indexPath.row]

设置collectionViewCells尺寸

return CGSize(width: collectionView.frame.width, height: cellHeightForPost[collectionView.tag][indexPath.row])