4

Ich habe UICollectionViewFlowLayout subclassed, um horizontale UICollectionView mit paging-ähnlichen Verhalten zu erhalten. Es funktioniert einwandfrei, solange UICollectionViewCell nicht die erste der letzten Zelle ist. Bilder unten angehängt.Hinzufügen von Padding zur ersten und letzten Zelle von UICollectionView

enter image description here enter image description here

Muss ich etwas in meinem UICollectionViewFlowLayout neben folgenden außer Kraft setzen müssen?

- (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; 
} 

Alle Hinweise/Kommentare werden nützlich sein.

+0

können Sie 'UIEdgeInsets verwenden sectionInset' -Eigenschaft von 'UICollectionViewFlowLayout'. Verweisen Sie auf diese [post] (http://stackoverflow.com/questions/16934831/placing-a-margin-around-e-ed-ed-the-uicollectionview). Weitere Informationen finden Sie in der Apple-Dokumentation unter [Verwenden des Abschnittseinschubs] (https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/UsingtheFlowLayout/UsingtheFlowLayout.html) –

Antwort

14

Sie können links und rechts einen Abstand einstellen, der Ihrer Auffüllung entspricht, wenn Sie den Rahmen Ihrer Sammlungsansicht einstellen.

oder

Sie können in cellForItemAtIndexPath setzen Bedingung, dass, wenn es erste Zelle oder letzte Zelle dann padding entsprechend verwalten ist. das ist es.

Oder

Sie contentInset Eigentum Ihrer Collection einstellen.

zum Beispiel

UICollectionView *cv; // your collectionView 

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

argh Ich habe zuletzt mit Abschnittseinfügung gespielt 30 min nie gedacht, den Einsatz von UICollectionView selbst zu setzen. – slonkar

+0

yeah, Einstellung contentInset ist eine gute Lösung für Ihren Fall. :) – Lion

+0

danke, diese Antwort hat mir sehr geholfen –

1

einfach Sie Kollektion Methoden verwenden UIEdgeInsets wie unten Verfahren einzustellen.

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

hier können Sie den Wert für den linken Seitenraum und rechten Seitenraum für die erste und letzte Zelle passieren, können Sie auch auf kleinstem Raum zwischen zwei Zellen durch Balg Verfahren bieten

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

Ich setze bereits ein, wenn ich eine Instanz von UICollectionViewFlowLayout erstelle. Es hilft also nicht und minimumInteritemSpacing ist hier nicht nützlich, weil ich horizontal Scroll mache. Sie müssen hier mindestLineSpacing verwenden, was ich bereits mache. – slonkar

Verwandte Themen