[ios] UICollectionView의 셀 간격

섹션에서 셀 간격을 어떻게 설정 UICollectionView합니까? minimumInteritemSpacing5.0으로 설정 한 속성 이 있지만 간격이 5.0으로 표시되지 않는 것을 알고 있습니다 . flowout delegate 메소드를 구현했습니다.

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

    return 5.0;
}

여전히 원하는 결과를 얻지 못했습니다. 나는 최소한의 간격을 생각합니다. 최대 간격을 설정할 수있는 방법이 없습니까?

시뮬레이터 사우스 캐롤라이나



답변

나는 그 주제가 오래되었다는 것을 알고 있지만, 여전히 당신이 필요로하는 사람이 여기에 정답을 필요로하는 경우 :

  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은 원하는 값으로 설정할 수 있습니다. 이 트릭은 셀 사이의 공간이 정확히 최대 간격과 동일하다는 것을 보장합니다 !!


답변

초기 질문을 지원합니다. 나는 간격을 5px로하려고 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;
}

업데이트 : 다음 코드로 내 문제를 해결했습니다.

여기에 이미지 설명을 입력하십시오

ViewController.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


답변

수평 흐름 레이아웃을 사용하여 셀 사이에 10 포인트 간격을 얻었습니다. 간격을 제거하려면 0 minimumLineSpacing뿐만 아니라 설정해야했습니다 minimumInterItemSpacing.

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

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


답변

그것이 기억 최소한의 줄 간격 , 최소하지 간 항목 간격 또는 셀 공간. collectionView의 스크롤 방향은 HORIZONTAL 입니다.

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

Objective-C 버전

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

스위프트 버전 :

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 파일에서 UICollectionView를 선택 하고 아래 이미지에 지정된 크기 검사기 를 클릭하십시오 .

여기에 이미지 설명을 입력하십시오

프로그래밍 방식으로 공간을 구성하려면 다음 속성을 사용하십시오.

1) 행간 간격을 설정합니다.

[self.collectionView setMinimumLineSpacing:5];

2) 항목 / 셀 사이의 공간을 설정합니다.

[self.collectionView setMinimumInteritemSpacing:5];