我正在制作EPG(电子节目指南);检索我使用JSON的程序信息。对于设计,我在左半部分有一个用于频道徽标和名称的表格视图,在右半部分有一个用于该频道的所有电视节目的集合视图。问题是,对于每个节目,集合视图行必须具有不同的宽度,这取决于节目的持续时间。
我根据这个名为EPG Grid
的奇妙示例构建它但是在这个例子中,所有通道都先前加载到一个数组中。如果频道列表很短,这可以正常工作,但在我的情况下,列表非常大,所以我需要加载tableView:cellForRowAtIndexPath:
中的每个频道,然后创建具有指定宽度的布局。
对此有何想法?
答案 0 :(得分:0)
我自己想通了,在我的情况下我不会使用UICollectionViewLayout
(CustomLayout)使用布局Flow
并在collectionView
内添加tableView
:
然后在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
}