У меня есть UICollectionView
, который показывает фотографии. Я создал коллекцию с помощью UICollectionViewFlowLayout
. Он работает хорошо, но я хотел бы иметь разметку на полях. Возможно ли это сделать с помощью UICollectionViewFlowLayout
или я должен реализовать свой собственный UICollectionViewLayout
?
UICollectionView Расстояние между полями
Ответ 1
Вы можете использовать метод collectionView:layout:insetForSectionAtIndex:
для вашего UICollectionView
или установить свойство sectionInset
объекта UICollectionViewFlowLayout
, прикрепленного к вашему UICollectionView
:
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
return UIEdgeInsetsMake(top, left, bottom, right);
}
или
UICollectionViewFlowLayout *aFlowLayout = [[UICollectionViewFlowLayout alloc] init];
[aFlowLayout setSectionInset:UIEdgeInsetsMake(top, left, bottom, right)];
Ответ 2
Настройка вложений в Interface Builder, как показано на скриншоте ниже
В результате получится что-то вроде этого:
Ответ 3
Чтобы добавить интервал в целиком UICollectionView
:
UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout*) collection.collectionViewLayout;
flow.sectionInset = UIEdgeInsetsMake(topMargin, left, bottom, right);
Чтобы играть с интервалом между элементами той же строки (столбец, если вы прокручиваете по горизонтали), и их размеры:
flow.itemSize = ...;
flow.minimumInteritemSpacing = ...;
Ответ 4
Только для исправления неверной информации на этой странице:
1- minimumInteritemSpacing: минимальное расстояние между элементами в одной строке.
Значение по умолчанию: 10.0.
(Для сетки с вертикальной прокруткой это значение представляет собой минимальное расстояние между элементами в той же строке.)
2- minimumLineSpacing: минимальный интервал между строками элементов в сетке.
Ответ 5
Swift 4
let flow = collectionView.collectionViewLayout as! UICollectionViewFlowLayout // If you create collectionView programmatically then just create this flow by UICollectionViewFlowLayout() and init a collectionView by this flow.
let itemSpacing: CGFloat = 3
let itemsInOneLine: CGFloat = 3
flow.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0)
let width = UIScreen.main.bounds.size.width - itemSpacing * CGFloat(itemsInOneLine - 1) //collectionView.frame.width is the same as UIScreen.main.bounds.size.width here.
flow.itemSize = CGSize(width: floor(width/itemsInOneLine), height: width/itemsInOneLine)
flow.minimumInteritemSpacing = 3
flow.minimumLineSpacing = 3
Ответ 6
используйте setMinimumLineSpacing:
и setMinimumInteritemSpacing:
в UICollectionViewFlowLayout
-Object.
Ответ 7
Modern Swift, автоматический расчет макета
Хотя эта ветка уже содержит кучу полезных ответов, я хочу добавить современную версию Swift, основанную на ответе Уильяма Ху. Это также улучшает две вещи:
- Интервал между различными линиями теперь всегда будет соответствовать интервалу между элементами в одной строке.
- Устанавливая минимальную ширину, код автоматически вычисляет количество элементов в строке и применяет этот стиль к макету потока.
Вот код:
// Create flow layout
let flow = UICollectionViewFlowLayout()
// Define layout constants
let itemSpacing: CGFloat = 1
let minimumCellWidth: CGFloat = 120
let collectionViewWidth = collectionView!.bounds.size.width
// Calculate other required constants
let itemsInOneLine = CGFloat(Int((collectionViewWidth - CGFloat(Int(collectionViewWidth / minimumCellWidth) - 1) * itemSpacing) / minimumCellWidth))
let width = collectionViewWidth - itemSpacing * (itemsInOneLine - 1)
let cellWidth = floor(width / itemsInOneLine)
let realItemSpacing = itemSpacing + (width / itemsInOneLine - cellWidth) * itemsInOneLine / (itemsInOneLine - 1)
// Apply values
flow.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
flow.itemSize = CGSize(width: cellWidth, height: cellWidth)
flow.minimumInteritemSpacing = realItemSpacing
flow.minimumLineSpacing = realItemSpacing
// Apply flow layout
collectionView?.setCollectionViewLayout(flow, animated: false)
Ответ 8
Чтобы разместить пробел между CollectionItem
, используйте этот
записать эту две строки в viewdidload
UICollectionViewFlowLayout *collectionViewLayout = (UICollectionViewFlowLayout*)self.collectionView.collectionViewLayout;
collectionViewLayout.sectionInset = UIEdgeInsetsMake(<CGFloat top>, <CGFloat left>, <CGFloat bottom>, <CGFloat right>)
Ответ 9
Использование collectionViewFlowLayout.sectionInset
или collectionView:layout:insetForSectionAtIndex:
верны.
Однако, если ваш CollectionView имеет несколько разделов, и вы хотите добавить маржу во весь набор CollectionView, я рекомендую использовать scrollView contentInset:
UIEdgeInsets collectionViewInsets = UIEdgeInsetsMake(50.0, 0.0, 30.0, 0.0);
self.collectionView.contentInset = collectionViewInsets;
self.collectionView.scrollIndicatorInsets = UIEdgeInsetsMake(collectionViewInsets.top, 0, collectionViewInsets.bottom, 0);
Ответ 10
Для добавления полей в указанные ячейки вы можете использовать этот настраиваемый макет потока. https://github.com/voyages-sncf-technologies/VSCollectionViewCellInsetFlowLayout/
extension ViewController : VSCollectionViewDelegateCellInsetFlowLayout
{
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForItemAt indexPath: IndexPath) -> UIEdgeInsets {
if indexPath.item == 0 {
return UIEdgeInsets(top: 0, left: 0, bottom: 10, right: 0)
}
return UIEdgeInsets.zero
}
}
Ответ 11
В Objective-C
CGFloat spacing = 5;
UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout*)_habbitCollectionV.collectionViewLayout;
flow.sectionInset = UIEdgeInsetsMake(0, spacing, 0, spacing);
CGFloat itemsPerRow = 2;
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat oneMore = itemsPerRow + 1;
CGFloat width = screenRect.size.width - spacing * oneMore;
CGFloat height = width / itemsPerRow;
flow.itemSize = CGSizeMake(floor(height), height);
flow.minimumInteritemSpacing = spacing;
flow.minimumLineSpacing = spacing;
Все, что вам нужно сделать, это изменить значение itemsPerRow, и оно соответствующим образом обновит количество элементов в строке. Кроме того, вы можете изменить значение интервала, если вы хотите более или менее общий интервал.
Ответ 12
В swift 4 и autoLayout вы можете использовать sectionInset следующим образом:
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical
layout.itemSize = CGSize(width: (view.frame.width-40)/2, height: (view.frame.width40)/2) // item size
layout.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10) // here you can add space to 4 side of item
collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: layout) // set layout to item
collectionView?.register(ProductCategoryCell.self, forCellWithReuseIdentifier: cellIdentifier) // registerCell
collectionView?.backgroundColor = .white // background color of UICollectionView
view.addSubview(collectionView!) // add UICollectionView to view
Ответ 13
Установите insetForSectionAt
свойство UICollectionViewFlowLayout
объекта прилагается к вашему UICollectionView
Обязательно добавьте этот протокол
UICollectionViewDelegateFlowLayout
стриж
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return UIEdgeInsets (top: top, left: left, bottom: bottom, right: right)
}
Цель - С
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
return UIEdgeInsetsMake(top, left, bottom, right);
}
Ответ 14
Чтобы добавить разделение 10px между каждой секцией, просто напишите это
flowLayout.sectionInset = UIEdgeInsetsMake(0.0, 0.0,10,0);
Ответ 15
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
return UIEdgeInsetsMake(7, 10, 5, 10);
}
Ответ 16
Мне помогло только это:
customFlowLayout.itemSize = CGSizeMake(self.view.frame.size.width / 3 - 3, self.view.frame.size.width / 3 - 3);
customFlowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;
customFlowLayout.minimumInteritemSpacing = 3;
customFlowLayout.minimumLineSpacing = 5;`
minimumLineSpacing
- расстояние между верхней и нижней строками изображений.
minimumInteritemSpacing
устанавливает минимальное расстояние между соседними изображениями.
Но вы также должны посмотреть здесь self.view.frame.size.width / 3 - 3
.
Первые 3 - это количество изображений в строке и секунде 3.
Результат