Заполнение 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 ответа:
Вы используете 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; }