tableview的行高不变,CollectionView捕获所有未使用的空间,而不是在tableViewCell中调整自身大小

时间:2016-06-13 13:19:36

标签: ios swift2 uicollectionview uicollectionviewlayout ios-autolayout

我按照此tutorial将{UICollectionView'放入UITableViewCell,在我的UICollectionViewCell中,有一个图像视图。因此,当我运行我的应用程序时,集合视图没有在我的单元格中同时调整自身大小我放置了一个文本视图,它根据内容调整自身大小,请参阅下面的图像:

在第一张图片中,我在顶部有一个文本视图,其中有一些文本,在它下面有(粉红色背景)是我的集合视图,其中有greenBackground是我的图像视图,你可以看到该集合视图占用了额外的空间而不是像文本视图那样减少自身。 enter image description here

在第二张图片中,您可以看到我的textView之前有更多内容,所以它的大小调整后现在与CollectionView重叠了 enter image description here

这是我的TableViewCell:

    class TableViewCell: UITableViewCell {


    @IBOutlet var txtView: UITextView!
    @IBOutlet private weak var collectionView: UICollectionView!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code

//        collectionView.frame = self.bounds;
//        collectionView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

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

        collectionView.delegate = dataSourceDelegate
        collectionView.dataSource = dataSourceDelegate
        collectionView.tag = row
        collectionView.reloadData()
    }


    var collectionViewOffset: CGFloat {
        get {
            return collectionView.contentOffset.x
        }

        set {

            collectionView.contentOffset.x = newValue

        }
    }


}

这是我的collectionViewCell

    class CollectionViewCell: UICollectionViewCell {

    @IBOutlet var imgView: UIImageView!


    override func awakeFromNib() {

        self.setNeedsLayout()
//        
//        self.contentView.frame = self.bounds;
//        self.contentView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]

    }


}

这是我的TableviewController

        // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(tableView: UITableView,
                            numberOfRowsInSection section: Int) -> Int {
        return imageModel.count
    }

    override func tableView(tableView: UITableView,
                            cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCellWithIdentifier("Cell",
                                                               forIndexPath: indexPath) as! TableViewCell

        cell.txtView.text = txtArray[indexPath.row]

        return cell
    }

    override func tableView(tableView: UITableView,
                            willDisplayCell cell: UITableViewCell,
                                            forRowAtIndexPath indexPath: NSIndexPath) {

        guard let tableViewCell = cell as? TableViewCell else { return }

        tableViewCell.setCollectionViewDataSourceDelegate(self, forRow: indexPath.row)

        tableViewCell.collectionViewOffset = storedOffsets[indexPath.row] ?? 0


    }




    override func tableView(tableView: UITableView,
                            didEndDisplayingCell cell: UITableViewCell,
                                                 forRowAtIndexPath indexPath: NSIndexPath) {

        guard let tableViewCell = cell as? TableViewCell else { return }

        storedOffsets[indexPath.row] = tableViewCell.collectionViewOffset
    }





}



extension TableViewController: UICollectionViewDelegate, UICollectionViewDataSource {
    func collectionView(collectionView: UICollectionView,
                        numberOfItemsInSection section: Int) -> Int {

        return imageModel[collectionView.tag].count
    }



    func collectionView(collectionView: UICollectionView,
                        cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell",
                                                                         forIndexPath: indexPath) as! CollectionViewCell



         cell.imgView.frame = CGRectMake(0, 0, collectionView.frame.width, collectionView.frame.height)

         cell.imgView.contentMode = .ScaleAspectFit


        //cell.addSubview(imageView)

         cell.imgView.image = ResizeImage(UIImage(named: imageModel[collectionView.tag][indexPath.item])!, targetSize: CGSizeMake( cell.imgView.frame.width ,  cell.imgView.frame.height))
        //imageView.image = UIImage(named: imageModel[collectionView.tag][indexPath.item])


        return cell
    }    

}

如何根据其中的内容将此集合视图设置为AutoLayout?我也试过这个:

    self.tableView.rowHeight = UITableViewAutomaticDimension;
    self.tableView.estimatedRowHeight = 100;

但没有奏效(我的收藏视图消失了)如果有人知道怎么做,请指导我..

1 个答案:

答案 0 :(得分:1)

当我在表格视图单元格中使用集合视图时,我遇到了类似的问题。无论我做了什么,我都无法让表格视图自动调整大小,但是集合视图确实如此。 Soo而不是autolayout我使用代码做到了。

我最终必须在集合视图中的集合视图numberOfSections中计算标签的大小,并使用委托将此高度传递给具有tableView的委托和dataSource的视图控制器,并重新加载相应的行表视图。

实际上,每次调用collectionview数据源中的numberOfSections,并且委托调整表视图高度的大小。 有点像这样 -

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{

    [self.delegate setViewHeight:[self getHeightForCellAtIndexPath:[NSIndexPath indexPathForRow:currentSelected inSection:0]]];

    return 1;
}

这应该给你一个大致的想法。

编辑:对不起,我以前误解了你的问题。这是适合你的事情:

根据我的理解,你有一个表格视图单元格,里面有标签视图和集合视图。

现在,在表格视图单元格中,您应该向标签添加顶部,前导和尾随约束空间。现在,在集合视图中,将图像垂直放置在中心,并在单元格超视图中添加适当的顶部和底部。您的集合视图本身应在前导,尾随,顶部到标签和底部到超级视图中具有CONSTANT值。还要为集合视图添加固定高度约束(假设您希望图像大小保持不变)。

现在让我们说View Controller A是表视图的数据源,表视图单元是集合视图的数据源。

在viewController A中,您应该将indexPath的行的高度写为 -

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    CGSize stringSize = [yourStringArray[indexPath.row] boundingRectWithSize:CGSizeMake(_yourCollectionView.frame.size.width, FLT_MAX)
                                                  options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
                                               attributes:@{NSFontAttributeName:[UIFont yourFont size:yourFontSize]} context:nil].

    return stringSize.height + 35; //magic number 35, play around with it to suit your need. Did this to always have a minimum fixed height.
}

这将允许您的tableViewRowForHeight为该特定索引添加标签的高度,其余约束应该完成。