UICollectionView-sizeForItemAtIndexPath计算不正确

yrefmtwq  于 2022-10-04  发布在  Swift
关注(0)|答案(1)|浏览(229)

我正在尝试使用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张照片创建了类似的组合,效果很好;不确定我在这里做错了什么。

感谢你的帮助。谢谢!

von4xj4u

von4xj4u1#

没有办法通过流布局来实现这一点。

UICollectionFlowLayout从左到右(或从右到左)按行布局项目,然后在没有可用空间时换行到新行。布局第一个单元格后,第二个单元格获得第一个单元格的高度(因为这是一行的高度),然后将其内容垂直居中。当布局第三个单元格时,它注意到第一行上没有剩余的空间,并换行到第二行。换句话说:布局永远不会为第二个单元格预留“剩余”空间,也不会回去用第三个单元格填充它。

如果布局是顶部两个较小的单元格,然后是一个较大的全宽单元格,则类似的组合也可以起作用。这与流布局兼容,因为它不依赖于返回。使用ScrollDirection=.HorizalLayout,您所要求的同样是可能的,因为布局将从上到下一个接一个地填充列,大的单元格将适合,然后是两个较小的单元格。但是--这意味着整个集合视图水平滚动。作为垂直布局的一部分,不可能做到这一点。

您正在寻找的是一种网格/平铺或“砖石”布局,其中有一些开源的替代方案。

相关问题