objective-c - uicollectionviewdatasource - uicollectionviewflowlayout




IOS UICollectionview Ändert die Höhe der Zelle dynamisch (4)

Soweit ich weiß, möchten Sie das Layout dieses Tests replizieren.

Sie müssen besser verstehen, wie UICollectionView funktioniert

Sie müssen die Anzahl der Elemente in Ihrer UICollectionView in dieser Delegate-Methode ändern:

- (NSInteger)numberOfItemsInSection:(NSInteger)section;

Hier wollen Sie zu Beginn des Tests 4, dann 4 * 2, 4 * 2 * 2 und so weiter ausgeben. Dadurch erhalten Sie die korrekte Anzahl an Artikeln.

Dann das Layout. Sie sollten mehrere Werte dafür haben, da Sie nicht den gleichen Abstand zwischen Ihren Elementen wie am Anfang und am Ende haben möchten. Ich würde den Raum verkleinern, wenn die Anzahl der Gegenstände wächst.

Sie müssen mit dem Abstand vorsichtig sein, da dies dazu führen kann, dass eine Zelle in die nächste Zeile gezwungen wird

Sie haben bereits eine großartige Arbeit geleistet, indem Sie den Rahmen geteilt haben, um die maximale Höhe und Breite einer Zelle zu erhalten, aber Ihre

- (CGSize)collectionView:(UICollectionView *)collectionView
              layout:(UICollectionViewLayout *)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath

Methode ist wirklich chaotisch.

Da Sie in Ihrer UICollectionView keine unbegrenzte Anzahl von Elementen UICollectionView , können Sie eine switch statement und in jedem Schalter die berechnete CGSize der Zelle zurückgeben.

Zum Beispiel können Sie es wie folgt verwenden:

    switch (numberOfHorizontalItems) {
      case 2:
            return CGSizeMake(self.collectionView.frame.size.width/2.5,self.collectionView.frame.size.width/2.5);
                break;

    case 4:
                return CGSizeMake(self.collectionView.frame.size.width/4.5,self.collectionView.frame.size.width/4.5);
                break;
    case 8:
                CGSizeMake(self.collectionView.frame.size.width/8.5,self.collectionView.frame.size.width/8.5);
                break;
(And so on)

      default:
                break;
        }

Sie sollten beachten, dass die CGSize angezeigte CGSize den Abstand zwischen den items

Sie benötigen auch nicht viewWillLayoutSubviews und viewDidLayoutSubviews , Sie müssen nur [self.collectionView reloadData] wenn der Benutzer auf eine Zelle [self.collectionView reloadData] (oder in der Methode, die die Logik behandelt, nachdem ein Benutzer auf eine Zelle [self.collectionView reloadData] )

Wenn Sie nicht möchten, dass die UICollectionView scrollbar ist, legen Sie einfach die Eigenschaft self.collectionView.scrollEnabled = NO;

Ich arbeite an einem Sammlungsansicht-basierten Projekt, auf dem Numberofitem geändert wird, und erhöht sich entsprechend dem Klick des Benutzers auf bestimmten Index. Alles funktioniert perfekt in meinem Projekt, aber ich bin nicht in der Lage, die Zellengröße nach der Anzahl der Zellen in der Sammlung-Ansicht zu setzen.Mehr darüber Sammlung wird nicht scrollbar alle Zelle beheben in Sicht mit der Größe ändern. Hier habe ich alle Bilder angehängt.

1) Storyboard-Ansicht

2) Ergebnis mit vier Zellen

3) wenn die Anzahl der Zellen zunimmt

Momentan habe ich meine Zelle auf diese Weise mit folgendem Code eingerichtet. aber ich möchte festlegen, dass, wenn es vier Zellen in der Sammlung-Ansicht gibt, dann die Größe jeder Zelle erhöht und passend nach Sammlung-Ansicht und Gerätegröße (iPhone 5s, iPhone 6, iPhone 6 plus)

Hier ist mein Versuch,

-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section{
    return 5.0;
}
-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{
    return 5.0;
}
- (CGSize)collectionView:(UICollectionView *)collectionView
              layout:(UICollectionViewLayout *)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
        ////@property NSInteger count;////
 if (_count == 0)  {
    //  width = ((width - (span*5))/4);
    //        return CGSizeMake(self.view.frame.size.width/4,  self.view.frame.size.height/4);
    return CGSizeMake(self.view.frame.size.width/2.5, self.view.frame.size.height/5);
}
if (_count == 1 || _count == 2)
{
    return CGSizeMake(self.view.frame.size.width/2.5, self.view.frame.size.height/5);
    // return CGSizeMake(100.0, 100.0);
}
if (  _count == 3 || _count == 4 || _count == 5)
{
    // return CGSizeMake(100.0, 100.0);
    return CGSizeMake(self.view.frame.size.width/3.5, self.view.frame.size.height/6.5);
}
if (  _count == 6 || _count == 7 || _count == 8 || _count == 9)
{
    //return CGSizeMake(90.0, 90.0);
    return CGSizeMake(self.view.frame.size.width/4, self.view.frame.size.height/8);
}
if (  _count == 10 || _count == 11 || _count == 12 || _count == 13 || _count == 14)
{
    //  return CGSizeMake(80.0, 80.0);
    return CGSizeMake(self.view.frame.size.width/4, self.view.frame.size.height/8);
}
if (  _count == 15 || _count == 16 || _count == 17 || _count == 18 || _count == 19 || _count ==20)
{
    //return CGSizeMake(70.0, 70.0);
    return CGSizeMake(self.view.frame.size.width/4.75, self.view.frame.size.height/9.5);
}
if (_count ==21 || _count == 22 || _count == 23 || _count == 24 || _count == 25 || _count == 26 || _count == 27) {
    // return CGSizeMake(60.0, 60.0);
    return CGSizeMake(self.view.frame.size.width/6, self.view.frame.size.height/12);
}
if (_count ==28 || _count == 29  ) {
    //  return CGSizeMake(50.0, 50.0);
    return CGSizeMake(self.view.frame.size.width/6.25, self.view.frame.size.height/12.5);
}
else
    return CGSizeMake(0, 0);
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return itemincollectionview.count;
}

Hinweis: - Ich habe auch diese ganze Methode ausprobiert.

  - (void)viewDidLayoutSubviews
  {
    self.automaticallyAdjustsScrollViewInsets = NO;
    [self.collectionView layoutIfNeeded];
    NSArray *visibleItems = [self.collectionView indexPathsForVisibleItems];
    NSIndexPath *currentItem = [visibleItems objectAtIndex:0];
    NSIndexPath *nextItem = [NSIndexPath indexPathForItem:_setRandomIndex inSection:currentItem.section];

    [self.collectionView scrollToItemAtIndexPath:nextItem atScrollPosition:UICollectionViewScrollPositionNone animated:YES];
 }

 - (void)viewWillLayoutSubviews
 {
    [super viewWillLayoutSubviews];
    [self.collectionView.collectionViewLayout invalidateLayout];
 }

 -(void)viewWillAppear:(BOOL)animated
 {
     [super viewWillAppear:YES];
     [self.view layoutIfNeeded];
 }

Verwenden Sie dieses GitHub CHTCollectionViewWaterfallLayout ist eine Unterklasse von UICollectionViewLayout, und es versucht, die Verwendung von UICollectionViewFlowLayout so viel wie möglich zu imitieren.

Dieses Layout ist von Pinterest inspiriert. Es ist auch kompatibel mit PSTCollectionView.



Alles in Ihrem Projekt ist in Ordnung. Sie müssen lediglich eine neue Delegate-Methode wie folgt hinzufügen:

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

Variieren Sie diese Methode entsprechend Ihrer Anzahl. Inset-Einstellung ist üblich für:

self.view.frame.size.width/2.5

und anders für:

self.view.frame.size.width/3.5

Daher wird das Problem mit dem zusätzlichen Abstand gelöst







uicollectionview