2014-05-23 14 views
9

Auf iOS 7. Ich habe Navigation Controller und ich schiebe einen neuen VC auf den Stapel._adjustContentOffsetIfNecessary - UIScrollView scrollt automatisch nach oben

Diese neue VC hat eine UIScrollView, die die Root-Ansicht der VC füllt und vertikal scrollt. Wenn ich ein wenig nach unten scrolle und dann versuche, 'swipe to back'/'swipe to pop' zu verwenden, scrollt die vertikale Bildlaufansicht zuerst nach oben, und dann wird der interactivePopGesture erkannt und ich kann den oberen VC auf den ziehen Stapel links und rechts.

Warum passiert das? Ich möchte verhindern, dass meine Bildlaufansicht automatisch nach oben scrollt, bevor die Geste "Wischen zum Zurückgehen" erkannt wird. Wie mache ich das?

UPDATE # 1:

Ich kann nicht scheinen, um diesen Fehler zu reproduzieren, wenn ich ein neues Xcode-Projekt zu erstellen, so ist es sicherlich Fehler meinerseits in dem ursprünglichen Projekt. Wird aktualisiert, wenn ich den Grund finde.

UPDATE # 2:

Wenn interactivePopGesture erkannt wird, wird setContentOffset Methode auf meiner vertikalen Scroll-Ansicht genannt. Während des Debuggens sehe ich, dass setContentOffset von UIScrollViewInternal _adjustContentOffsetIfNecessary aufgerufen wurde.

UPDATE # 3:

Das gleiche Problem in einem folgenden Szenario passiert: Ich habe UITextFields innerhalb einer vertikalen UIScrollView. Wenn ein bestimmtes UITextField gedrückt wird, erscheint eine Tastatur. Wenn ich die Tastatur interaktiv verwerfen möchte (indem ich die Bildlaufansicht über die Tastatur ziehe), passiert nach dem Loslassen des Ziehens ein Fehler. Der Inhalts-Offset von UIScrollView wurde vorübergehend auf Null gesetzt und dann auf den ursprünglichen Inhalts-Offset zurückgesetzt und mit der Animation fortgefahren. Diese unerwünschte Einstellung von contentOffset wird auch von UIScrollViewInternal _adjustContentOffsetIfNecessary aufgerufen.

Ich ging voran und ersetzte die UIScrollView in beiden Szenarien mit meiner eigenen Unterklasse von UIScrollView. In dieser Unterklasse habe ich eine private Methode -(void) _adjustContentOffsetIfNecessary als leere void-Methode überschrieben. Beide Probleme waren beseitigt, und ich konnte keine negativen Folgen feststellen. Dies ist keine Lösung und ich werde diesen Ansatz nicht verwenden, da ich keine Ahnung habe, was genau ich getan habe.

+0

Kann etwas mit UIViewController SetAutomatisch AdjustScrollViewInsets api auf iOS7 –

+0

Ich setze automatisch AdjustScrollViewInsets = NO; auf jeden Blick Controller dachte ich könnte für die Situation relevant sein. Es hilft nicht. – ancajic

+0

Ich habe dieses Problem ebenfalls gelöst. Ich habe contentOffset manuell als (0, -64) festgelegt, aber _adjustContentOffsetIfNecessary hat es wieder in -108 geändert. Verwirrt. Irgendein Update? – Wingzero

Antwort

0

Ich habe eine interesting discussion darüber auf Twitter gefunden. Obwohl es nicht mein Fall ist, könnte es jemand helfen:

Is there some trick to bring UINavigationController to not mess with a UIScrollView (_adjustContentOffsetIfNecessary)? 

@steipete Searching for the same thing and came across your tweet. I set contentOffset but it resets back to -64 (ios7). Did you find a fix? 
@errthling Add a dummy view as first subview. It won’t look further. 
@steipete Wow – that worked. I've been struggling with it for days. Thanks for that and everything else you put out there! :) 
@errthling happy to help! 

@steipete did you find an answer to this, 2 years ago? =D my scrollview's contentOffset is reset when I push a new viewcontroller.. 
@manuelmaly Yeah. Changed the view hierarchy so the scroll view is not the main view and not the first subview, and UIKit stops messing. 
@steipete oO i hacked it in the meantime by blocking setContentOffset before pushViewController is called. your solution seems cleaner tho 

twitter discussion

0

Verwenden UIViewController mit einem UITableView statt UITableViewController. Es löste mein Problem :)

Verwandte Themen