Заполнение UICollectionViewCell


Я пытаюсь установить нулевое заполнение на ячейках вида коллекции, я установил "минимальный интервал" на контроллере вида:

Введите описание изображения здесь

Но у него все еще есть промежутки между ячейками:

Введите описание изображения здесь

Кроме того, я хотел бы, чтобы ячейки хорошо обтекались в зависимости от ширины кадра, например, каждая ячейка имеет ширину 50 пикселей, поэтому, если есть шесть ячеек, и я установил ширину кадра в 150 пикселей, он будет отображать две строки из трех ячеек.

Тем не менее, если я установлю ширину кадра в 150 на выполнение:

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGRect frame = self.collectionView.frame;
    frame.size.width = 150;
    self.collectionView.frame = frame;
}

Это выглядит как на приведенном выше снимке экрана (слишком широкий).

Если я установлю его на что-то смехотворно маленькое, такое как 10, то он в некоторой степени обернется:

Введите описание изображения здесь

Ячейка UICollectionViewCell имеет значение 50 x 50:

Введите описание изображения здесь

Я также попытался установить размер ячейки программно, а также удалил UIEdgeInset:

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
    return UIEdgeInsetsMake(0, 0, 0, 0);
}

Я отключил автоматическую раскладку только в том случае, если у нее были какие-либо помехи. Любые советы о том, как я могу удалить обивка, а также есть ли у них обертка в зависимости от ширины / высоты рамы?

4 8

4 ответа:

Вы используете UICollectionViewController, который, как и UITableViewController, имеет представление коллекции (или представление таблицы) в качестве базового свойства view контроллера вида. Это означает, что он не может быть изменен из контроллера вида; его размер контролируется его супервизором-либо окном, в данном случае, которое имеет его в качестве корневого контроллера вида, либо родительским контроллером вида, если вы его внедряли.

Если вы хотите уменьшить область просмотра коллекции так, чтобы ячейки примыкали друг к другу кроме того, вы можете изменить вставки разделов представления коллекции в раскадровке. В вашем случае вставка из 15 левых и правых ячеек объединяет ячейки - это 9 * 50 (450) плюс 30 = 480, что соответствует ширине 3,5-дюймового iPhone в ландшафте.

Очевидно, что это будет отличаться в iPhone 5 или iPad. Можно либо вычислить вставки во время выполнения, либо использовать представление коллекции, содержащееся в стандартном подклассе UIViewController, либо использовать UICollectionViewController в качестве встроенного представления контроллер. Последние два позволят вам просто указать размер, что, вероятно, лучше, чем вычислять вставки.

Я не уверен, что эти ячейки на скриншоте 50x50 (EDIT: я думаю, что это так...).

Проверьте, подключены ли UICollectionViewDelegate и UICollectionViewDataSource.

Это именно тот метод, который вам нужно реализовать

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    CGSize retval = CGSizeMake(50, 50);
    return retval;
}

Если это не работает, попробуйте поместить этот код в viewDidLoad

UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
[flowLayout setMinimumInteritemSpacing:0.0f];
[flowLayout setMinimumLineSpacing:0.0f];
[flowLayout setItemSize:CGSizeMake(50.0f, 50.0f)];
[self.collectionView setCollectionViewLayout:flowLayout];

Реализуйте этот метод в своем ViewController

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section
{
   return 2; //the spacing between cells is 2 px here
}

MinimumInteritemSpacing - это просто минимальное значение, поэтому оно может быть больше, если класс UICollectionViewLayout решит, что оно должно быть

Чтобы исправить это, вы можете создать свой собственный подкласс компоновки и реализовать метод - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath, что-то вроде ответа из этого вопроса (см. Второй вопрос, а не тот, который помечен как правильный)

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewLayoutAttributes* atts =
    [super layoutAttributesForItemAtIndexPath:indexPath];

    if (indexPath.item == 0) // degenerate case 1, first item of section
        return atts;

    NSIndexPath* ipPrev =
    [NSIndexPath indexPathForItem:indexPath.item-1 inSection:indexPath.section];

    CGRect fPrev = [self layoutAttributesForItemAtIndexPath:ipPrev].frame;
    CGFloat rightPrev = fPrev.origin.x + fPrev.size.width + 10;
    if (atts.frame.origin.x <= rightPrev) // degenerate case 2, first item of line
        return atts;

    CGRect f = atts.frame;
    f.origin.x = rightPrev;
    atts.frame = f;
    return atts;
}