4

UICollectionViewFlowLayout을 하위 클래스 화하여 동작과 유사한 페이징으로 UICollectionView를 가로로 가져옵니다. UICollectionViewCell이 마지막 셀이 아닌 한 완벽하게 작동합니다. 아래에 첨부 된 이미지. UICollectionView의 첫 번째 셀과 마지막 셀에 패딩 추가

enter image description here enter image description here

내가 다음 외에 내 UICollectionViewFlowLayout에 뭔가를 재정의해야합니까?

- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity 
{ 
CGFloat offSetAdjustment = MAXFLOAT; 
CGFloat horizontalCenter = (CGFloat) (proposedContentOffset.x + (self.collectionView.bounds.size.width/2.0)); 

CGRect targetRect = CGRectMake(proposedContentOffset.x, 
           0.0, 
           self.collectionView.bounds.size.width, 
           self.collectionView.bounds.size.height); 

NSArray *array = [self layoutAttributesForElementsInRect:targetRect]; 
for (UICollectionViewLayoutAttributes *layoutAttributes in array) 
{ 
    if(layoutAttributes.representedElementCategory == UICollectionElementCategoryCell) 
    { 
     CGFloat itemHorizontalCenter = layoutAttributes.center.x; 
     if (ABS(itemHorizontalCenter - horizontalCenter) < ABS(offSetAdjustment)) 
     { 
      offSetAdjustment = itemHorizontalCenter - horizontalCenter; 
     } 
    } 
} 

CGFloat nextOffset = proposedContentOffset.x + offSetAdjustment; 

do { 
    proposedContentOffset.x = nextOffset; 
    CGFloat deltaX = proposedContentOffset.x - self.collectionView.contentOffset.x; 
    CGFloat velX = velocity.x; 

    if(deltaX == 0.0 || velX == 0 || (velX > 0.0 && deltaX > 0.0) || (velX < 0.0 && deltaX < 0.0)) 
    { 
     break; 
    } 

    if(velocity.x > 0.0) 
    { 
     nextOffset += [self snapStep]; 
    } 
    else if(velocity.x < 0.0) 
    { 
     nextOffset -= [self snapStep]; 
    } 
} while ([self isValidOffset:nextOffset]); 

proposedContentOffset.y = 0.0; 

return proposedContentOffset; 
} 
    - (BOOL)isValidOffset:(CGFloat)offset 
{ 
    return (offset >= [self minContentOffset] && offset <= [self maxContentOffset]); 
} 

- (CGFloat)minContentOffset 
{ 
    return -self.collectionView.contentInset.left; 
} 

- (CGFloat)maxContentOffset 
{ 
    return [self minContentOffset] + self.collectionView.contentSize.width -  self.itemSize.width; 
} 

- (CGFloat)snapStep 
{ 
return self.itemSize.width + self.minimumLineSpacing; 
} 

모든 의견/설명이 유용 할 것입니다.

+0

UICollectionViewFlowLayout의 섹션 인셋 속성 이 [게시물] (http://stackoverflow.com/questions/16934831/placing-a-margin-around-each-edge-of-the-uicollectionview)을 참조하십시오. [Section inset 사용하기] (https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/UsingtheFlowLayout/FlowLayout.html을 참조하십시오.) –

답변

14

컬렉션보기의 프레임을 설정할 때 왼쪽 및 오른쪽으로 패딩과 같은 공간을 설정할 수 있습니다.

또는

당신이 첫 번째 셀 또는 마지막 셀이있는 경우 그에 따라 패딩을 관리하는 cellForItemAtIndexPath에 조건을 넣을 수 있습니다

. 그게 다야.

또는

당신은 당신의 collectionView의 contentInset 속성을 설정할 수 있습니다. 예를 들어

,

UICollectionView *cv; // your collectionView 

cv.contentInset = UIEdgeInsetsMake(0, 5, 0, 5); 
+0

에서 Apple Documentation을 참조하십시오. 마지막으로 섹션 삽입물을 가지고 놀고 있습니다. 30 분은 UICollectionView 자체의 인세 트 설정을 생각하지 않았습니다. – slonkar

+0

예, contentInset을 설정하는 것이 좋은 해결책입니다. :) – Lion

+0

감사합니다.이 대답은 제게 많은 도움이되었습니다 –

1

당신이 우는 방법 같은 UIEdgeInsets을 설정 collectionview 방법을 사용할 수 있습니다 간단합니다. 여기

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

는 왼쪽 공간이 제 1 및 마지막 셀 오른쪽 공간에 대한 값을 전달할 수 있고, 또한 노호 방법으로 두 셀 사이에 최소의 공간을 제공 할 수

는`UIEdgeInsets 사용할 수
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section { 
    return 5.0; 
} 
+0

UICollectionViewFlowLayout의 인스턴스를 만들 때 이미 인 세트를 설정하고 있습니다. 따라서 수평 스크롤을 수행하기 때문에 도움이되지 않으며 minimumInteritemSpacing이 유용하지 않습니다. 이미 최소 LineSpacing을 사용해야합니다. – slonkar

관련 문제