programing

UICollection View의 셀 간격

sourcejob 2023. 4. 24. 23:09
반응형

UICollection View의 셀 간격

'셀 ' 의 셀 해야 합니까?UICollectionView이 것은 있습니다minimumInteritemSpacing55.0.5.0이 .이치노

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section
{

    return 5.0;
}

여전히 원하는 결과를 얻지 못하고 있습니다.최소 띄어쓰기인 것 같아요.최대 간격을 설정할 수 있는 방법은 없습니까?

시뮬레이터 sc

첫 번째 질문을 뒷받침합니다.의 .UICollectionView안 요.UIEdgeInsetsMake(0,0,0,0)

UITableView에서는 x, y 좌표를 일렬로 직접 지정함으로써 이 작업을 수행할 수 있습니다.

여기에 이미지 설명 입력

내 UICollectionView 코드:

#pragma mark collection view cell layout / size
- (CGSize)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return [self getCellSize:indexPath];  // will be w120xh100 or w190x100
    // if the width is higher, only one image will be shown in a line
}

#pragma mark collection view cell paddings
- (UIEdgeInsets)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
    return UIEdgeInsetsMake(0, 0, 0, 0); // top, left, bottom, right
}

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {

    return 5.0;
}

업데이트: 다음 코드를 사용하여 문제를 해결했습니다.

여기에 이미지 설명 입력

View Controller.m

#import "ViewController.h"
#import "MagazineCell.h" // created just the default class. 

static NSString * const cellID = @"cellID";

@interface ViewController ()

@end

@implementation ViewController

#pragma mark - Collection view
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 30;
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    MagazineCell *mCell = (MagazineCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];

    mCell.backgroundColor = [UIColor lightGrayColor];

    return mCell;
}

#pragma mark Collection view layout things
// Layout: Set cell size
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

    NSLog(@"SETTING SIZE FOR ITEM AT INDEX %d", indexPath.row);
    CGSize mElementSize = CGSizeMake(104, 104);
    return mElementSize;
}
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {
    return 2.0;
}

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {
    return 2.0;
}

// Layout: Set Edges
- (UIEdgeInsets)collectionView:
(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
   // return UIEdgeInsetsMake(0,8,0,8);  // top, left, bottom, right
    return UIEdgeInsetsMake(0,0,0,0);  // top, left, bottom, right
}

@end

이 주제가 오래되었다는 것은 알지만, 아직 정답이 필요한 사람이 있을 경우 다음을 참조하십시오.

  1. 표준 흐름 레이아웃을 재정의합니다.
  2. 다음과 같이 구현 추가:

    - (NSArray *) layoutAttributesForElementsInRect:(CGRect)rect {
        NSArray *answer = [super layoutAttributesForElementsInRect:rect];
    
        for(int i = 1; i < [answer count]; ++i) {
            UICollectionViewLayoutAttributes *currentLayoutAttributes = answer[i];
            UICollectionViewLayoutAttributes *prevLayoutAttributes = answer[i - 1];
            NSInteger maximumSpacing = 4;
            NSInteger origin = CGRectGetMaxX(prevLayoutAttributes.frame);
    
            if(origin + maximumSpacing + currentLayoutAttributes.frame.size.width < self.collectionViewContentSize.width) {
                CGRect frame = currentLayoutAttributes.frame;
                frame.origin.x = origin + maximumSpacing;
                currentLayoutAttributes.frame = frame;
            }
        }
        return answer;
    }
    

여기서 maximumSpacing은 원하는 값으로 설정할 수 있습니다.이 트릭에 의해 셀 사이의 간격이 maximumSpacing!!과 정확하게 같아집니다.

수평 흐름 레이아웃을 사용하여 셀 사이에 10점 간격을 두었습니다.를 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★minimumLineSpacing만 아니라minimumInterItemSpacing0으로로로합합합합합

UICollectionViewFlowLayout *flow = [[UICollectionViewFlowLayout alloc] init];
flow.itemSize = CGSizeMake(cellWidth, cellHeight);
flow.scrollDirection = UICollectionViewScrollDirectionHorizontal;
flow.minimumInteritemSpacing = 0;
flow.minimumLineSpacing = 0;

또한 모든 셀의 크기가 동일한 경우 위임 방법을 사용하는 대신 흐름 레이아웃에서 직접 속성을 설정하는 것이 더 간단하고 효율적입니다.

최소 항목 간 간격이나 셀 공간이 아니라 최소공간입니다.collectionView의 스크롤 방향이 수평이기 때문입니다.

수직인 경우 셀 공간 또는 셀 사이의 수평 공간에 대한 항목 간 공간을 설정하고 셀 간의 수직 공간에 대한 줄 간격을 설정해야 합니다.

Objective-C 버전

- (CGFloat)collectionView:(UICollectionView *)collectionView
                       layout:(UICollectionViewLayout*)collectionViewLayout
    minimumLineSpacingForSectionAtIndex:(NSInteger)section
    {
        return 20;
    }

Swift 버전:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return 20
}

각 항목 사이에 5px의 간격을 두려면 다음 코드를 사용해 보십시오.

- (UIEdgeInsets)collectionView:(UICollectionView *) collectionView 
                        layout:(UICollectionViewLayout *) collectionViewLayout 
        insetForSectionAtIndex:(NSInteger) section {

    return UIEdgeInsetsMake(0, 0, 0, 5); // top, left, bottom, right
}

- (CGFloat)collectionView:(UICollectionView *) collectionView
                   layout:(UICollectionViewLayout *) collectionViewLayout
  minimumInteritemSpacingForSectionAtIndex:(NSInteger) section {    
    return 5.0;
}

가장 인기 있는 답변의 빠른 버전입니다.셀 사이의 공간은 다음과 같습니다.cellSpacing.

class CustomViewFlowLayout : UICollectionViewFlowLayout {

    let cellSpacing:CGFloat = 4

    override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        if let attributes = super.layoutAttributesForElementsInRect(rect) {
        for (index, attribute) in attributes.enumerate() {
                if index == 0 { continue }
                let prevLayoutAttributes = attributes[index - 1]
                let origin = CGRectGetMaxX(prevLayoutAttributes.frame)
                if(origin + cellSpacing + attribute.frame.size.width < self.collectionViewContentSize().width) {
                    attribute.frame.origin.x = origin + cellSpacing
                }
            }
            return attributes
        }
        return nil
    }
}

IB를 사용하여 셀이나 행 사이의 간격을 설정하는 매우 쉬운 방법을 찾았습니다.

스토리보드/Xib 파일에서 UICollection View를 선택하고 아래 그림과 같이 Size Inspector를 클릭합니다.

여기에 이미지 설명 입력

공간을 프로그램적으로 구성하려면 다음 속성을 사용하십시오.

1) 행간 간격 설정용.

[self.collectionView setMinimumLineSpacing:5];

2) 항목/셀 사이의 공간을 설정하기 위해 사용합니다.

[self.collectionView setMinimumInteritemSpacing:5];

최소 속성 이름을 기록해 두십시오.InterItemSpacing 입니다.이것은 정확한 간격이 아닌 항목 사이의 최소 간격입니다.최소값을 설정한 경우InterItem 간격 간격은 그 값보다 작은 값이 되지 않도록 할 수 있습니다.하지만 더 높은 가치를 얻을 가능성이 있다.

실제로 항목 간 간격은 항목 크기 단면에 따라 달라집니다.삽입. 컬렉션 뷰는 이러한 값을 기반으로 동적으로 컨텐츠를 배치합니다.그래서 정확한 간격을 보장할 수 없습니다.섹션으로 시행착오를 수행해야 합니다.설치 및 최소값InterItem Spacing(항목 간 간격).

Swift 3.0, Xcode 8에 대한 답변

1. 컬렉션 뷰 대리자를 설정했는지 확인합니다.

class DashboardViewController: UIViewController {
    @IBOutlet weak var dashboardCollectionView: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()
        dashboardCollectionView.delegate = self
    }
}

2. UICollectionViewDelegate가 아닌 UICollectionViewDelegateFlowLayout 프로토콜을 구현합니다.

extension DashboardViewController: UICollectionViewDelegateFlowLayout {
    fileprivate var sectionInsets: UIEdgeInsets {
        return .zero
    }

    fileprivate var itemsPerRow: CGFloat {
        return 2
    }

    fileprivate var interitemSpace: CGFloat {
        return 5.0
    }

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAt indexPath: IndexPath) -> CGSize {
        let sectionPadding = sectionInsets.left * (itemsPerRow + 1)
        let interitemPadding = max(0.0, itemsPerRow - 1) * interitemSpace
        let availableWidth = collectionView.bounds.width - sectionPadding - interitemPadding
        let widthPerItem = availableWidth / itemsPerRow

        return CGSize(width: widthPerItem, height: widthPerItem)
    }

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        insetForSectionAt section: Int) -> UIEdgeInsets {
        return sectionInsets
    }

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 0.0
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return interitemSpace
    }
}

띄어쓰기에 대한 간단한 코드

let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
layout.minimumInteritemSpacing = 10 // Some float value

투표된 답변(및 빠른 버전)에는 작은 문제가 있습니다. 오른쪽에 큰 간격이 있을 것입니다.

플로트 좌측 동작으로 셀 간격을 정확하게 하기 위해 플로우 레이아웃이 커스터마이즈되기 때문입니다.

해결책은 단면 삽입을 조작하여 단면이 중앙에 정렬되도록 하고 간격은 정확히 지정된 대로 지정하는 것입니다.

다음 스크린샷에서는 항목/행 간격이 정확히 8pt인데 반해 왼쪽과 오른쪽 삽입 섹션은 8pt보다 커집니다(중앙에 맞춥니다).

균일한 간격의 세포

다음과 같은 신속한 코드:

private let minItemSpacing: CGFloat = 8
private let itemWidth: CGFloat      = 100
private let headerHeight: CGFloat   = 32

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    // Create our custom flow layout that evenly space out the items, and have them in the center
    let layout = UICollectionViewFlowLayout()
    layout.itemSize = CGSize(width: itemWidth, height: itemWidth)
    layout.minimumInteritemSpacing = minItemSpacing
    layout.minimumLineSpacing = minItemSpacing
    layout.headerReferenceSize = CGSize(width: 0, height: headerHeight)

    // Find n, where n is the number of item that can fit into the collection view
    var n: CGFloat = 1
    let containerWidth = collectionView.bounds.width
    while true {
        let nextN = n + 1
        let totalWidth = (nextN*itemWidth) + (nextN-1)*minItemSpacing
        if totalWidth > containerWidth {
            break
        } else {
            n = nextN
        }
    }

    // Calculate the section inset for left and right. 
    // Setting this section inset will manipulate the items such that they will all be aligned horizontally center.
    let inset = max(minItemSpacing, floor( (containerWidth - (n*itemWidth) - (n-1)*minItemSpacing) / 2 ) )
    layout.sectionInset = UIEdgeInsets(top: minItemSpacing, left: inset, bottom: minItemSpacing, right: inset)

    collectionView.collectionViewLayout = layout
}

스토리보드 어프로치

스토리보드에서 Collection View를 선택하고 크기 검사기로 이동하여 셀과 행의 최소 간격을 5로 설정합니다.

Swift 5 프로그래밍 방식

lazy var collectionView: UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .horizontal

        //Provide Width and Height According to your need
        let width = UIScreen.main.bounds.width / 4
        let height = UIScreen.main.bounds.height / 10
        layout.itemSize = CGSize(width: width, height: height)

        //For Adjusting the cells spacing
        layout.minimumInteritemSpacing = 5
        layout.minimumLineSpacing = 5

        return UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
    }()

의 정의UICollectionViewDelegateFlowLayout할 수 있습니다.

방법은 시행합니다.UICollectionViewDelegateFlowLayout다음과 같이 합니다.

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

여기를 클릭하면, 다음의 Apple 문서를 참조할 수 있습니다.UIEdgeInsetMake★★★★★★ 。

만약 당신이 실제 셀 크기를 건드리지 않고 간격을 조정하고 싶다면, 이것이 나에게 가장 적합한 해결책입니다.#xcode9 #tvOS11 #iOS11 #스위프트

따라서 UICollection ViewDelegate FlowLayout에서는 변경을 통해 다음 방법을 구현합니다.이 두 가지 방법을 모두 사용해야 합니다.이 매뉴얼에서는 이러한 방향으로 생각하도록 지시하지 않았습니다.:D

open func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    return cellSpacing
}

public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return cellSpacing
}

수평 컬렉션 뷰를 작성할 경우 셀 사이에 공간을 확보하려면 속성을 설정해야 합니다.

monotoouch를 사용하고 있기 때문에 이름과 코드가 조금 다르지만, 컬렉션 뷰의 너비가 (x * 셀 폭) + (x-1) * 최소 간격 x = 행당 셀 양과 같도록 하면 됩니다.

최소값에 따라 다음 단계를 수행합니다.항목 간 간격 및 셀 폭

1) 셀 크기 + 전류 삽입 + 최소 간격에 따라 행당 항목 수를 계산한다.

float currentTotalWidth = CollectionView.Frame.Width - Layout.SectionInset.Left - Layout.SectionInset.Right (Layout = flowlayout)
int amountOfCellsPerRow = (currentTotalWidth + MinimumSpacing) / (cell width + MinimumSpacing)

2) 컬렉션 뷰의 예상 너비를 계산할 수 있는 모든 정보를 확보했습니다.

float totalWidth =(amountOfCellsPerRow * cell width) + (amountOfCellsPerRow-1) * MinimumSpacing

3) 현재 폭과 예상 폭의 차이는

float difference = currentTotalWidth - totalWidth;

4) 이제 inset을 조정합니다(이 예에서는 collection view의 왼쪽 위치가 동일하게 유지되도록 오른쪽에 추가합니다).

Layout.SectionInset.Right = Layout.SectionInset.Right + difference;

나는 수평이 있다.UICollectionView및 서브클래스UICollectionViewFlowLayout컬렉션 뷰에는 큰 셀이 있으며 한 번에 하나의 행만 표시되며 컬렉션 뷰는 화면 너비에 맞게 표시됩니다.

iago849의 답변을 시도해보니 효과가 있었지만, 그 후 그의 답변이 필요없다는 것을 알게 되었다.어떤 이유에서인지,minimumInterItemSpacing아무것도 하지 않습니다.아이템/셀 사이의 간격은 다음 조작으로 완전히 제어할 수 있습니다.minimumLineSpacing.

왜 이런 식으로 돌아가는지 모르겠지만, 효과가 있어요.

델의 솔루션Swift 3Instagram과 같은 셀 행 간격:

여기에 이미지 설명 입력

lazy var collectionView: UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
    cv.backgroundColor = UIColor.rgb(red: 227, green: 227, blue: 227)
    cv.showsVerticalScrollIndicator = false
    layout.scrollDirection = .vertical
    layout.minimumLineSpacing = 1
    layout.minimumInteritemSpacing = 1
    return cv
}()

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    switch UIDevice.current.modelName {
    case "iPhone 4":
        return CGSize(width: 106, height: 106)
    case "iPhone 5":
        return CGSize(width: 106, height: 106)
    case "iPhone 6,7":
        return CGSize(width: 124, height: 124)
    case "iPhone Plus":
        return CGSize(width: 137, height: 137)
    default:
        return CGSize(width: frame.width / 3, height: frame.width / 3)
    }
}

디바이스를 프로그래밍 방식으로 검출하는 방법:https://stackoverflow.com/a/26962452/6013170

OP와 비슷한 문제를 우연히 발견했어요.불행하게도, 받아들여진 답변은 나에게 효과가 없었다. 왜냐하면 그 내용은collectionView제대로 중심이 잡히지 않을 겁니다.그래서 나는 다른 해결책을 생각해 냈는데, 그것은 단지 모든 아이템을 필요로 한다.collectionView같은 너비이며, 이는 질문의 경우인 것 같습니다.

#define cellSize 90

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
    float width = collectionView.frame.size.width;
    float spacing = [self collectionView:collectionView layout:collectionViewLayout minimumInteritemSpacingForSectionAtIndex:section];
    int numberOfCells = (width + spacing) / (cellSize + spacing);
    int inset = (width + spacing - numberOfCells * (cellSize + spacing) ) / 2;

    return UIEdgeInsetsMake(0, inset, 0, inset);
}

이 코드에 의해 반환된 값이...minimumInteritemSpacing...정확한 간격이 될 것이다collectionViewCell게다가 세포들이 모두 중앙으로 모일 수 있다는 것을 보증합니다.collectionView

vojtech-vrbka에 의한 위의 솔루션은 올바르지만 경고를 트리거합니다.

경고:UICollectionViewFlowLayout에서 인덱스 경로 - 캐시된 값에 대해 캐시된 프레임 불일치가 있습니다.이는 흐름 레이아웃 서브클래스의 Layout이 UICollectionViewFlowLayout에 의해 반환된 속성을 복사하지 않고 수정하기 때문에 발생할 수 있습니다.

다음 코드로 수정할 수 있습니다.

class CustomViewFlowLayout : UICollectionViewFlowLayout {

   let cellSpacing:CGFloat = 4

   override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
       let original = super.layoutAttributesForElementsInRect(rect)

       if let original = original {
           let attributes = NSArray.init(array: original, copyItems: true) as! [UICollectionViewLayoutAttributes]

           for (index, attribute) in attributes.enumerate() {
                if index == 0 { continue }
                let prevLayoutAttributes = attributes[index - 1]
                let origin = CGRectGetMaxX(prevLayoutAttributes.frame)
                if(origin + cellSpacing + attribute.frame.size.width < self.collectionViewContentSize().width) {
                    attribute.frame.origin.x = origin + cellSpacing
                }
            }
            return attributes
       }
       return nil
   }
}

수락한 답변에 문제가 있어 업데이트했습니다.이 방법은 유효합니다.

.h

@interface MaxSpacingCollectionViewFlowLayout : UICollectionViewFlowLayout
@property (nonatomic,assign) CGFloat maxCellSpacing;
@end

.m

@implementation MaxSpacingCollectionViewFlowLayout

- (NSArray *) layoutAttributesForElementsInRect:(CGRect)rect {
    NSArray *attributes = [super layoutAttributesForElementsInRect:rect];

    if (attributes.count <= 0) return attributes;

    CGFloat firstCellOriginX = ((UICollectionViewLayoutAttributes *)attributes[0]).frame.origin.x;

    for(int i = 1; i < attributes.count; i++) {
        UICollectionViewLayoutAttributes *currentLayoutAttributes = attributes[i];
        if (currentLayoutAttributes.frame.origin.x == firstCellOriginX) { // The first cell of a new row
            continue;
        }

        UICollectionViewLayoutAttributes *prevLayoutAttributes = attributes[i - 1];
        CGFloat prevOriginMaxX = CGRectGetMaxX(prevLayoutAttributes.frame);
        if ((currentLayoutAttributes.frame.origin.x - prevOriginMaxX) > self.maxCellSpacing) {
            CGRect frame = currentLayoutAttributes.frame;
            frame.origin.x = prevOriginMaxX + self.maxCellSpacing;
            currentLayoutAttributes.frame = frame;
        }
    }
    return attributes;
}

@end

Swift 3 버전

UICollectionViewFlowLayout 서브클래스를 만들고 이 메서드를 붙여넣기만 하면 됩니다.

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        guard let answer = super.layoutAttributesForElements(in: rect) else { return nil }

        for i in 1..<answer.count {
            let currentAttributes = answer[i]
            let previousAttributes = answer[i - 1]

            let maximumSpacing: CGFloat = 8
            let origin = previousAttributes.frame.maxX

            if (origin + maximumSpacing + currentAttributes.frame.size.width < self.collectionViewContentSize.width && currentAttributes.frame.origin.x > previousAttributes.frame.origin.x) {
                var frame = currentAttributes.frame
                frame.origin.x = origin + maximumSpacing
                currentAttributes.frame = frame
            }
        }

        return answer
}

iago849의 답변을 시도해보니 효과가 있었다.

스위프트 4

open override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    guard let answer = super.layoutAttributesForElements(in: rect) else {
        return nil
    }
    let count = answer.count
    for i in 1..<count {
        let currentLayoutAttributes = answer[i]
        let prevLayoutAttributes = answer[i-1]
        let origin = prevLayoutAttributes.frame.maxX
        if (origin + CGFloat(spacing) + currentLayoutAttributes.frame.size.width) < self.collectionViewContentSize.width && currentLayoutAttributes.frame.origin.x > prevLayoutAttributes.frame.origin.x {
            var frame = currentLayoutAttributes.frame
            frame.origin.x = origin + CGFloat(spacing)
            currentLayoutAttributes.frame = frame
        }
    }
    return answer
}

여기 github 프로젝트 링크가 있습니다.https://github.com/vishalwaka/MultiTags

Swift 5 UIKit 프로그래밍 방식

 //Create UICollectionView
lazy var collectionView: UICollectionView = {
    
    let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .horizontal
    
    //CollectionCellView width autoSize
    layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
    
    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
    collectionView.translatesAutoresizingMaskIntoConstraints = false
    
    collectionView.register(CustomCollectionViewCell.self, forCellWithReuseIdentifier: cellId)
    collectionView.backgroundColor = .clear
    collectionView.delegate = self
    collectionView.dataSource = self
    collectionView.alwaysBounceHorizontal = true

//Add Spacing in each cell
    layout.minimumInteritemSpacing = 15
    layout.minimumLineSpacing = 15
    
    return collectionView
}()

이전 버전은 섹션 > 1에서는 제대로 동작하지 않았습니다.그러므로 이 솔루션은 https://codentrick.com/create-a-tag-flow-layout-with-uicollectionview/에서 찾을 수 있습니다.게으른 사람:

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    let attributesForElementsInRect = super.layoutAttributesForElements(in: rect)
    var newAttributesForElementsInRect = [UICollectionViewLayoutAttributes]()
    // use a value to keep track of left margin
    var leftMargin: CGFloat = 0.0;
    for attributes in attributesForElementsInRect! {
        let refAttributes = attributes 
        // assign value if next row
        if (refAttributes.frame.origin.x == self.sectionInset.left) {
            leftMargin = self.sectionInset.left
        } else {
            // set x position of attributes to current margin
            var newLeftAlignedFrame = refAttributes.frame
            newLeftAlignedFrame.origin.x = leftMargin
            refAttributes.frame = newLeftAlignedFrame
        }
        // calculate new value for current margin
        leftMargin += refAttributes.frame.size.width + 10
        newAttributesForElementsInRect.append(refAttributes)
    }

    return newAttributesForElementsInRect
}

다음 방법을 사용해 보십시오.

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView
                    layout:(UICollectionViewLayout*)collectionViewLayout
    insetForSectionAtIndex:(NSInteger)section {

    UIEdgeInsets insets = UIEdgeInsetsMake(?, ?, ?, ?);

    return insets;
}

언급URL : https://stackoverflow.com/questions/17229350/cell-spacing-in-uicollectionview

반응형