답변:
에 대한 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)];
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return UIEdgeInsets(top: 25, left: 15, bottom: 0, right: 5)
}
UICollectionViewDelegateFlowLayout
이 방법을 사용하려면 ViewController 대리인 목록에 추가 하십시오insetForSectionAtIndex
온 간격을 추가하려면 전체 UICollectionView
:
UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout*) collection.collectionViewLayout;
flow.sectionInset = UIEdgeInsetsMake(topMargin, left, bottom, right);
같은 행의 요소 (가로로 스크롤하는 경우 열)와 해당 크기 사이 의 간격을 유지하려면 :
flow.itemSize = ...;
flow.minimumInteritemSpacing = ...;
collection.collectionViewLayout
@Pooja의 예제와 같이 캐스트 가 필요합니다. UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout*) self.collectionViewLayout;
if let flow = collectionViewLayout as? UICollectionViewFlowLayout { flow.itemSize = CGSize(width: 100, height: 100) }
스위프트 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 = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 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
XCode 11.4 및 신속한 5 편집
let flow = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
작동하지 않습니다. 아래 작품을 사용하십시오.
let flow = UICollectionViewFlowLayout()
backgroundColor
하십시오 collectionView
. 또는 슈퍼 뷰가 무엇이든간에.
이 페이지에서 잘못된 정보를 수정하면됩니다.
1- minimumInteritemSpacing : 같은 행에있는 항목 사이에 사용할 최소 간격입니다.
기본값은 10.0입니다.
세로 스크롤 그리드의 경우이 값은 같은 행에있는 항목 사이의 최소 간격을 나타냅니다.
2- minimumLineSpacing : 그리드의 항목 라인 사이에 사용할 최소 간격입니다.
이 스레드에는 이미 유용한 답변이 많이 있지만 William Hu의 답변을 기반으로 최신 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 / max(1, 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)
itemsInOneLine
1 인 다음 이는 현재 0으로 나눔에 NaN이 될 것이다itemsInOneLine / (itemsInOneLine - 1)
사용 setMinimumLineSpacing:
및 setMinimumInteritemSpacing:
온 UICollectionViewFlowLayout
-object.
사용 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);
사이에 공백을 넣으려면 CollectionItem
이것을 사용하십시오.
이 두 줄을 viewdidload에 작성하십시오.
UICollectionViewFlowLayout *collectionViewLayout = (UICollectionViewFlowLayout*)self.collectionView.collectionViewLayout;
collectionViewLayout.sectionInset = UIEdgeInsetsMake(<CGFloat top>, <CGFloat left>, <CGFloat bottom>, <CGFloat right>)
에 연결된 객체 의 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)
}
목표-C
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
return UIEdgeInsetsMake(top, left, bottom, right);
}
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 값을 변경하기 만하면 행당 항목 수가 업데이트됩니다. 또한 일반적인 간격을 원하는 경우 간격 값을 변경할 수 있습니다.
지정된 셀에 여백을 추가하기 위해이 사용자 정의 플로우 레이아웃을 사용할 수 있습니다. 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
}
}
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
각 섹션 사이에 10px 구분을 추가하려면 다음을 작성하십시오.
flowLayout.sectionInset = UIEdgeInsetsMake(0.0, 0.0,10,0);