在运行时更改集合视图单元格宽度

时间:2016-03-14 19:31:42

标签: ios cocoa-touch uicollectionview

我正在制作EPG(电子节目指南);检索我使用JSON的程序信息。对于设计,我在左半部分有一个用于频道徽标和名称的表格视图,在右半部分有一个用于该频道的所有电视节目的集合视图。问题是,对于每个节目,集合视图行必须具有不同的宽度,这取决于节目的持续时间。

我根据这个名为EPG Grid

的奇妙示例构建它

但是在这个例子中,所有通道都先前加载到一个数组中。如果频道列表很短,这可以正常工作,但在我的情况下,列表非常大,所以我需要加载tableView:cellForRowAtIndexPath:中的每个频道,然后创建具有指定宽度的布局。

对此有何想法?

2 个答案:

答案 0 :(得分:0)

我自己想通了,在我的情况下我不会使用UICollectionViewLayout(CustomLayout)使用布局Flow并在collectionView内添加tableView

enter image description here enter image description here

然后在tableView的每一行委托collectionView

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{        
    let cell: CustomTableViewCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomTableViewCell

    cell.collectionView.delegate = self
    cell.collectionView.dataSource = self
    cell.collectionView.tag = indexPath.row

    cell.tag = 100 + indexPath.row;

    return cell;
}

委托后,调用方法collectionView:sizeForItemAtIndexPath,在此方法中,您必须使用indexPath计算检索数据的宽度或高度

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize 
{
    //Calculation of width based on indexPath

    //...
    return CGSizeMake(width, 89)
}

最后,为了使所有单元格的卷轴均匀,请使用方法scrollViewDidScroll。查看此帖子:Horizontally scroll ALL rows of UICollectionView together

func scrollViewDidScroll(scrollView: UIScrollView) {

    var ret: Bool = false;

    if (self.lastContentOffset > scrollView.contentOffset.x)
    {
        ret = true;
    }
    else if (self.lastContentOffset < scrollView.contentOffset.x)
    {
        ret = true;
    }        

    if(scrollView.isKindOfClass(UICollectionView) && ret)
    {
        self.lastContentOffset = scrollView.contentOffset.x;
        for var i = 0; i < data.count; i++
        {
            let cell = self.view.viewWithTag(100 + i) as? ChannelTableViewCell;

            if(cell != nil)
            {
                let collectionCell: UICollectionView? = cell?.collectionView;

                if(collectionCell != nil)
                {
                    collectionCell!.contentOffset = scrollView.contentOffset;
                }
            }
        }
    }
}

答案 1 :(得分:0)

这是Swift 5唯一对我有用的东西,希望对您有所帮助。

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) 
{
     super.viewWillTransition(to: size, with: coordinator)
            
     collectionView.collectionViewLayout.invalidateLayout()
     collectionView.frame.size = size
}