UICollectionView: нежелательное пространство между элементами последней строки - PullRequest
0 голосов
/ 18 марта 2019

Я хочу, чтобы мои ячейки отображались так

X
Group 1
X X X
X X
Group 2
X X X
X X X

Но это вывод, который я получаю. Я не ожидаю, что ячейка с именем Home будет выровнена по центру, а также не ожидаю места в середине для 2-го ряда сообщения Сотрудника.

enter image description here

private class MenuDelegate : UICollectionViewDelegateFlowLayout
{

    private const int interItemSpacing = 12;

    private readonly double _itemWidth;
    private readonly double _itemsPerRow;

    private readonly List<MenuItem> _items;


    public MenuDelegate(List<MenuItem> items)
    {
        _items = items;
        _itemsPerRow = DisplayUtils.IsIPad ? 5 : 3;
        _itemWidth = (PlatformConstants.MenuWidth - ((_itemsPerRow - 1) * interItemSpacing)) / _itemsPerRow;
    }

    public override CGSize GetSizeForItem(UICollectionView collectionView,
                                              UICollectionViewLayout layout, NSIndexPath indexPath)
    {
        if (_items[indexPath.Row].Parent) {
            return new CGSize(DisplayUtils.ScreenWidth, 44);
        }
        return new CGSize(_itemWidth, _itemWidth);
    }

    public override void ItemSelected(UICollectionView collectionView, NSIndexPath indexPath)
    {
        HandleCellSelect(_items[indexPath.Row]);
    }

    public override nfloat GetMinimumInteritemSpacingForSection(UICollectionView collectionView, UICollectionViewLayout layout, nint section)
    {
        return interItemSpacing;
    }

    public override nfloat GetMinimumLineSpacingForSection(UICollectionView collectionView, UICollectionViewLayout layout, nint section)
    {
        return float.Epsilon;
    }
}

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

У меня был подкласс UICollectionViewFlowLayout для достижения желаемого результата.

private class CustomFlowLayout : UICollectionViewFlowLayout
{
    public override UICollectionViewLayoutAttributes[] LayoutAttributesForElementsInRect(CGRect rect)
    {
        var attributes = base.LayoutAttributesForElementsInRect(rect);

        var leftMargin = SectionInset.Left;
        var maxY = 2.0f;

        var horizontalSpacing = 6f; // spacing between the items.

        foreach (var attribute in attributes) {
            if (attribute.Frame.Y >= maxY || attribute.Frame.X == SectionInset.Left) {
                leftMargin = SectionInset.Left;
            }
            if (attribute.Frame.X == SectionInset.Left)
                leftMargin = SectionInset.Left;
            else
                attribute.Frame = new CGRect(leftMargin, attribute.Frame.Y, attribute.Frame.Width, attribute.Frame.Height);

            leftMargin += attribute.Frame.Width + horizontalSpacing;
            maxY = (float)Math.Max(attribute.Frame.GetMaxY(), maxY);
        }

        return attributes;
    }
}
0 голосов
/ 19 марта 2019

Вы пытались переопределить LayoutAttributesForElementsInRect в пользовательском UICollectionViewFlowLayout и установить атрибуты.Это происходит, когда UICollectionViewFlowLayout возвращает 2 атрибута для одной ячейки.

public class CustomFlowLayout : UICollectionViewFlowLayout
    {
        public override UICollectionViewLayoutAttributes[] LayoutAttributesForElementsInRect(CGRect rect)
        {
            UICollectionViewLayoutAttributes[]  attributes = base.LayoutAttributesForElementsInRect(rect);
            UICollectionViewLayoutAttributes[]  newAttributes = new UICollectionViewLayoutAttributes[attributes.Length];
            foreach (UICollectionViewLayoutAttributes attribute in attributes)
            {
                if ((attribute.Frame.X + attribute.Frame.Width<= this.CollectionViewContentSize.Width) &&
                    (attribute.Frame.Y + attribute.Frame.Height <= this.CollectionViewContentSize.Height))
                {
                    newAttributes.Append(attribute);
                }
            }
            return newAttributes;
        }

    }

Для более подробной информации вы можете проверить здесь

...