我正在尝试使用UICollectionViewFlowLayout实现以下目标:
不知何故,这两张小照片不太合适,代码是这样的:
以下代码是用C#编写的,任何正确答案都将被接受:)
nfloat cellSpacing = 4;
[Export("collectionView:layout:sizeForItemAtIndexPath:")]
public CGSize GetSizeForItem(UICollectionView collectionView, UICollectionViewLayout layout, NSIndexPath indexPath)
{
double width;
if (_events[indexPath.Section].Moments.Count == 3)
{
CGSize size;
width = _newsFeedController.View.Frame.Width/ 3;
var height = width * 3;
if (indexPath.Row == 0)
{
size= new CGSize((width * 2)-(cellSpacing/2), height);
return size;
}
else
{
size = new CGSize(width - (cellSpacing / 2), (height-cellSpacing)/2);
return size ;
}
}
}
[Export("collectionView:layout:minimumInteritemSpacingForSectionAtIndex:")]
public nfloat GetMinimumInteritemSpacingForSection(UICollectionView collectionView, UICollectionViewLayout layout, nint section)
{
return 0;
}
[Export("collectionView:layout:insetForSectionAtIndex:")]
public UIEdgeInsets GetInsetForSection(UICollectionView collectionView, UICollectionViewLayout layout, nint section)
{
return new UIEdgeInsets(0, 0, 0, 0);
}
[Export("collectionView:layout:minimumLineSpacingForSectionAtIndex:")]
public nfloat GetMinimumLineSpacingForSection(UICollectionView collectionView, UICollectionViewLayout layout, nint section)
{
return cellSpacing;
}
我还做了手工计算,以确保它与填充物匹配,但无论我做什么,结果都是这样:
顺便说一句,我已经为5张和4张照片创建了类似的组合,效果很好;不确定我在这里做错了什么。
感谢你的帮助。谢谢!
1条答案
按热度按时间von4xj4u1#
没有办法通过流布局来实现这一点。
UICollectionFlowLayout从左到右(或从右到左)按行布局项目,然后在没有可用空间时换行到新行。布局第一个单元格后,第二个单元格获得第一个单元格的高度(因为这是一行的高度),然后将其内容垂直居中。当布局第三个单元格时,它注意到第一行上没有剩余的空间,并换行到第二行。换句话说:布局永远不会为第二个单元格预留“剩余”空间,也不会回去用第三个单元格填充它。
如果布局是顶部两个较小的单元格,然后是一个较大的全宽单元格,则类似的组合也可以起作用。这与流布局兼容,因为它不依赖于返回。使用ScrollDirection=.HorizalLayout,您所要求的同样是可能的,因为布局将从上到下一个接一个地填充列,大的单元格将适合,然后是两个较小的单元格。但是--这意味着整个集合视图水平滚动。作为垂直布局的一部分,不可能做到这一点。
您正在寻找的是一种网格/平铺或“砖石”布局,其中有一些开源的替代方案。