18

Ich habe eine UICollectionView mit einem benutzerdefinierten UICollectionViewLayout (eigentlich verwende ich this nice layout).UICollectionView contentOffset ändert sich mit benutzerdefinierten Layout

Ich setze contentOffset = CGPointZero in viewDidLoad. Nach viewDidLoad jedoch ist der Offset -20, und der Inhalt wird wie so nach unten gedrückt:


picture

(Es soll mit der Linie bündig sein). Ich lade das Layout der Sammlungsansicht im Interface Builder. Es scheint, dass mein Problem sehr ähnlich zu this one ist, aber die Lösungen dort funktionieren nicht für mich.

Ich habe versucht, in meiner Layout-Implementierung collectionViewContentSize zu ändern, um sicherzustellen, dass es immer größer als die Größe der CollectionView war. Obwohl dies bedeutet, dass ich meinen Inhalt nach unten scrollen kann (er ist kürzer als die Höhe der collectionView) und den zusätzlichen Platz verberge, kann ich auch zurück scrollen, um ihn zu sehen.

Nichts scheint zu funktionieren!

Antwort

13

Die einzige Lösung, die ich mit, dass einfiel hatte kaum akzeptablen Verhalten:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    if (self.collectionView.contentOffset.y < 0) { 
     self.collectionView.contentOffset = CGPointMake(self.collectionView.contentOffset.x, 0.0); 
    } 
} 

Neben Einstellen der Höhe des Inhalts zu fmax(self.collectionView.frame.size.height + 20, [self stackedSectionHeight]) in collectionViewContentSize

Dieser den Raum über dem Abschnitt entfernt Header, aber es entfernt den "Bounce" von oben. Eine ziemlich suboptimale Lösung, aber ziemlich akzeptabel.

Ich werde eine bessere Antwort akzeptieren, wenn jemand eine hat, oder wenn ich eine finde, werde ich diese Antwort aktualisieren.

+1

Ich habe ein ähnliches Problem bei der Verwendung von horizontalem Layout. –

+0

Im veritalen Layout ist der Inhalt in Ordnung. Wenn das Layout-Objekt horizontal geändert wird, verschwindet der gesamte Inhalt –

+0

Das gleiche Problem und die gleiche Lösung habe ich gefunden. Ich bekomme dies nur auf iOS7 SDK und nur bei iOS7.Das Merkwürdigste ist, dass ein anderes scrollView in anderen viewController dieses Problem nicht hat .. Ich breche meinen Kopf, aber keinen Grund gefunden –

45

Ich fand den Grund, warum dies passiert. Schauen Sie sich die akzeptierte Antwort auf dieser Frage: Status bar and navigation bar appear over my view's bounds in iOS 7

der Tat konnten wir nur gesetzt edgesForExtendedLayout oder automaticallyAdjustsScrollViewInsets Eigenschaften von UIViewController in IB (wenn Sie Storyboard verwenden) von in viewDidLoad und es wird unser Problem beheben.

Nur nicht vergessen, für diese Eigenschaft am Check-out ist, weil in iOS6 oder vor ihm Absturz verursacht:

if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) { 
    self.automaticallyAdjustsScrollViewInsets = NO; 
} 

Grüße!

+6

Beachten Sie, dass wenn Sie eine Sammlung View-Controller in einem übergeordneten View-Controller enthalten, müssen Sie 'automatischAdjustScrollViewInsets setzen 'auf dem * übergeordneten * Controller. – zoul

+0

Ich hatte einen Fall, in dem ich eine CollectionView mit 74h mal 30w Zellen platzieren wollte, die jedes Mal, wenn ich vom Eltern-View-Controller zum anderen wechselte, um -44 versetzt wurden. Versucht, dies für fast zwei Stunden zu lösen, indem es so viele falsche Wege versucht. Vielen Dank. – devdc

0

Ich fing an, dieses Problem auf iOS 11 zu finden, wo ich einen Bildlauf in einer Bildlaufansicht hatte. Nahm mich fast einen Tag, um es herauszufinden.

versuchen, den Inhalt Inset Anpassungsverhalten einstellen:

if #available(iOS 11.0, *) { 
    scrollView.contentInsetAdjustmentBehavior = .never 
} 

Diese festen meine Kollektion es ist Inhalt Einsatz nach unten eine kleine Menge als Kollektion Rahmen Anpassung würde hinter dem sicheren Bereich des umschließenden Scroll bewegen.