UIRefreshControl muss zu weit heruntergezogen werden

8

Ich versuche ein UIRefreshControl in meinem Projekt auf einem UICollectionView zu implementieren. Es funktioniert wie beabsichtigt, aber ich muss die UICollectionView ungefähr 3x so viel wie die Höhe von refreshControl ziehen, wenn es sich dreht (sobald der Benutzer losgelassen hat). Ich habe andere Apps gesehen, bei denen du nur die Höhe von refreshControl herunterziehen musst, wenn sie sich dreht. Wie ändere ich die Menge, die ich herunterziehen muss?

Code:

%Vor%

Anbei sind Bilder, um zu veranschaulichen, was ich meine. Mein collectionView hat eine Zeile (durchgehend rot). Der Abstand zwischen dem roten und dem refreshControl ist einfach der Raum, den ich herunterziehe, um zu versuchen, refreshControl zu aktivieren.

In diesem Bild habe ich fast das Steuerelement aktiviert und ich habe bereits eine beträchtliche Menge auf dem Bildschirm heruntergezogen.

In diesem Bild habe ich das Steuerelement aktiviert und es beginnt zu laden (nachdem es springt ~ 20-30 pix, aber es zeigt immer noch, wie wichtig das ist)

Dieses Bild zeigt das Steuerelement im Ruhezustand, nachdem es aktiviert wurde und die Animation ausführt.

Ich habe versucht, den Rahmen von UIRefreshControl zu setzen, um zu versuchen, die Höhe zu kontrollieren, aber das funktioniert nicht. Ich habe auch die Größe in collectionView:layout:sizeForItemAtIndexPath geändert, was nicht geholfen hat.

    
LyricalPanda 05.03.2015, 19:44
quelle

3 Antworten

2

Wenn ein UIRefreshControl zu weit heruntergezogen werden muss, um es auszulösen, könnte dies ein Fehler des iOS SDK sein.

Ich empfehle, diese Situation mit Hilfe eines View-Controllers zu lösen:

%Vor%

Auch wenn es Ihnen nichts ausmacht, private API zu verwenden und genauere Kontrolle zu benötigen, können Sie so schreiben:

%Vor%

Dies funktioniert auf iOS 7-10. Kein App Store-Überprüfungsproblem.

Ansehen

UIRefreshControl hat eine Eigenschaft namens snappingHeight. Diese Eigenschaft steuert die Entfernung, die der Benutzer herunterziehen muss. Aber leider ist dieser Wert nicht immer richtig eingestellt, vor allem haben Sie eine benutzerdefinierte Ansichtshierarchie.

UIRefreshControl hat eine private Methode namens _updateSnappingHeight , diese Methode wird auch in didMoveToSuperview aufgerufen. Daher kann ein manueller didMoveToSuperview -Aufruf den falschen Fangwert aktualisieren.

    
BB9z 07.11.2016 08:56
quelle
0

Hatte in iOS 10.2 ein Problem damit. Für alle, die immer noch darunter leiden, habe ich einen Weg gefunden, dies zu tun, ohne die privaten API-Methoden zu berühren (obwohl das das Problem auch behob).

Ich habe festgestellt, dass ich ein Problem hatte, als das Gerät auf dem iPad rotierte. UIRefreshControl verhält sich im Hochformat korrekt, würde jedoch beim Drehen des Geräts fehlerhaft arbeiten. Danach war es egal, in welcher Richtung es sich befand, es musste immer viel zu weit gezogen werden, um aktiviert zu werden.

Meine Lösung basierte auf dieser Antwort: UIRefreshControl abgleichen

Ich habe versucht, den Rahmen des UIRefreshControls einzustellen, wenn das Gerät gedreht wurde und es funktioniert hat. Es ist nicht ideal, da es nicht AutoLayout verwendet, aber es ist ein bisschen sauberer als mit privaten APIs zu spielen.

%Vor%     
darkbreed 12.01.2017 13:59
quelle
0

Für Leute, die immer noch nach einer Antwort darauf suchen. Ich habe eine eindeutige und bestmögliche Antwort bis jetzt ...

SWIFT 3:

InnenansichtDidLoad ():

%Vor%

Weiter Wenn Ihre View ein ViewController ist, implementieren Sie das ScrollViewDelegate wie folgt:

%Vor%

Sobald Sie Ihr scrollView @IBOulet verknüpft haben ... Gehen Sie voran und setzen Sie den scrollView-Delegaten auf self in viewDidLoad () wie folgt:

%Vor%

Nachdem Sie die Delegierten eingerichtet haben, richten Sie als Nächstes die scrollViewDidScroll-Funktion ein und implementieren Sie sie, um zu prüfen, ob die heruntergezogene Person den Wert -90 wie folgt überschritten hat:

%Vor%

Beachten Sie, dass wir das

nicht haben %Vor%

und wir brauchen es auch gar nicht. Stattdessen rufen wir beginRefresh () auf, gefolgt von der eigentlichen Funktion ... Stellen Sie sicher, dass Sie endRefresh () an einem beliebigen Ort aufrufen, an dem sie enden soll.

    
amirkrd 21.02.2018 18:01
quelle

Tags und Links